An Introduction to PySTAC for Remote Sensing¶

Mikael Brunila
Geographic Information Centre (McGill)

February 2025¶

Overview¶

  • Part 1: Introduction (15 min)
    • Issues with remote sensing (RS) data
    • What is STAC?
    • What is PySTAC?
  • Part 2: Code demo (30 min)
    • Finding buildings in the Palisades Fire area in LA using Sentinel-2 data
  • Part 3: Hands-on (45 min+)
    • Finding burned buildings in the Palisades Fire area in LA using Sentinel-2 data

First...¶

Let's make sure all of you have the relevant notebook and files. You have two options:

  1. Google Colab
  2. Clone from Github

Google Colab¶

Go to https://github.com/maybemkl/gic-rs-tutorials.

Make sure you have the relevant files on your instance. These should include:

  • A folder called "data"
  • A folder called "img"
  • A .py file called "utiles.py"
  • A .py file called spectral_indexes.py

If you do not have them:

  1. Download them from https://www.mediafire.com/file/656ulooyxizybxc/pystac_files.zip/file
  2. Upload them to the Google Colab

Git Pull¶

Go to https://github.com/maybemkl/gic-rs-tutorials and follow the instructions there.

Part 1: Introduction¶

Remote Sensing¶

Remote sensing is the process of detecting and collecting information of the physical characteristics of or on the Earth without making contact with the area.

There are today more than 10,000 (as of July 2024) satellites orbiting the Earth. They gather data at various resolutions (including very fine).

Most of these satellites are private, a significant amount owned or operated by StarLink.

  • At least 1,052 “earth observations”

Remote Sensing Data¶

Remote sensing data is often stored in very large image files of high-resolution formats like .tif.

Storing and processing this data in very unwieldy. This is where tools and platforms like STAC, Google Earth Engine (GEE), and Microsoft Planetary Computer (MPC) come in. They provide data standards (STAC) or cloud computing resources (GEE, MPC).

STAC: Spatio-Temporal Asset Catalog¶

A "common language to describe geospatial information". No processing capabilities, not a cloud service like GEE or MPC (which uses STAC). STAC is all about standardizing metadata for geospatial data, enabling better data discovery and interoperability.

Provides standards for storing, indexing, and accessing geospatial data in general and satellite RS data in particular. We can "postpone" the actual processing until the very last step by relying on interconnected metadata instead.

JSON-files that are organized in a hierarchy:

  • Item (images for bands in a given area, e.g. a Sentinel-2 scene from a specific bbox)
  • Collection (sets of images from a given source, e.g. Sentinel-2 and LandSat)
  • Catalog (a list of data sources)

STAC: Item¶

A STAC Item represents *one* captured image, e.g., a Sentinel-2 scene over New York on 2024-06-15.

Drawing

Source: The STAC Specification

STAC: Item¶

If this was your STAC item, you could choose "assets" within this bbox, including and RGB image or specific "bands" (red, blue, green, but also near infrared, short-wave infrared, etc.).

Drawing

Source: The STAC Specification

STAC: Collection¶

A STAC Collection groups multiple images from the same source (e.g. Sentinel-2 ) together. It defines shared metadata like temporal coverage and data sources.

Drawing

Source: The STAC Specification

STAC: Catalog¶

A STAC Catalog is a higher-level structure that links different collections (e.g., Sentinel-2, Landsat, NAIP).

Drawing

Source: The STAC Specification

STAC: Catalog¶

A STAC catalog has its own specification in something like catalog.json. In addition to collections, it can include individual items.

Drawing

Source: The STAC Specification

STAC: Programming Languages and Frameworks¶

  • Python: pystac
  • JavaScript: stac-server
  • Rust: stac-rs
  • R: rstac
  • QGIS: qgis-stac-plugin

PySTAC¶

The most actively maintained and comprehensive framework for accessing STAC assets. Provides tools for searching, filtering, and accessing dozens of STAC catalogs.

Additionally, offers in-memory manipulations of STAC catalogs: Load and work with STAC catalog data as Python objects entirely within your computer's memory. Data loaded like this is by default in the xarray format, but we will often convert it to numpy for the sake of simplicity.

An overview of catalogs can be found here. Today we will be using Earth Search by Amazon owned Element84.

Part 2: Code Demo¶

Part 2A: Preamble¶

The LA 2025 Fires¶

  • From January 7th to 31st
  • Killed 28+ people (wite 31+ more still missing) and forced 200,000+ to evacuate
  • Destroyed 18,189+ buildings
  • Concentrated in the Altadena and Pacific Palisades neighborhoods

Our Case Study: The Palisades Fire¶

  • Pacific Palisades
  • Killed 12 people (with 7 more still missing) and forced 105,000 to evacuate
  • Destroyed 6,837 buildings, damaged 1,017

Our Case Study: The Palisades Fire¶

  • Researchers at CUNY and Oregon State University used data from the Sentinel-1 and Sentinel-2 satellites to assess the damage
  • We will try to replicate part of the study by using Sentinel-2 data
Drawing

Source: How and Why a CUNY Graduate Center Student Maps the Devastation of Wildfires and War

At the end, we will have replicated this map to produce a very close estimate using only spectral indexes:

Drawing

Spectral Indexes¶

Spectral indexes are mathematical formulas used in remote sensing to highlight specific surface features in satellite images. By comparing different wavelengths of reflected light, these indexes help identify patterns such as vegetation growth, water presence, urban areas, or burned regions.

For instance: The Normalized Difference Vegetation Index (NDVI) measures vegetation health by comparing NIR and Red reflectance. Higher values indicate healthy vegetation, while lower values suggest bare soil, water, or built-up areas.

$NDVI = \frac{\text{NIR} - \text{Red}}{\text{NIR} + \text{Red}}$

Spectral Indexes for Analysing Structural Fire Damage¶

For our analysis, we want to:

  1. Preprocess by removing big bodies of water such as the ocean
  2. Identify buildings
  3. Identify areas that were burned after the fire
  4. Find the overlap between buildings and burned areas

Removing water: NDWI¶

The Normalized Difference Water Index (NDWI) highlights water bodies by comparing Green and NIR reflectance. Higher values indicate water, while lower values represent vegetation or soil.

$NDWI = \frac{\text{Green} - \text{NIR}}{\text{Green} + \text{NIR}}$

Identifying buildings: NDBI and IBI¶

The Normalized Difference Built-up Index (NDBI) is used to identify and distinguish built-up areas like cities and urban environments. Higher positive values indicate more built-up areas:

$NDBI = \frac{\text{SWIR}_1 - \text{NIR}}{\text{SWIR}_1 + \text{NIR}}$

IBI improves upon NDBI by combining multiple spectral signals, offering a more nuanced and accurate depiction of built-up areas, especially in mixed landscapes. Higher IBI als indicate more built-up areas:

$IBI = \frac{\text{NDBI} - (\text{NDVI} + \text{NDWI})}{\text{NDBI} + (\text{NDVI} + \text{NDWI})}$

Today, we will use IBI.

Identifying burns: NBR and dNBR¶

NBR is used to detect burned areas and assess fire severity by comparing Near-Infrared (NIR) and Shortwave Infrared (SWIR-2) reflectance. Healthy vegetation has high NIR reflectance and low SWIR-2 reflectance, while burned areas show the opposite pattern. Higher NBR values indicate healthy vegetation, while lower values indicate burned or barren land.

$NBR = \frac{\text{NIR} - \text{SWIR}_2}{\text{NIR} + \text{SWIR}_2}$

By comparing the pre-fire and post-fire NBR, we can get a sense of what areas were ravaged by the fire:

$\mathrm{dNBR} = \mathrm{NBR}_{\text{pre}} - \mathrm{NBR}_{\text{post}}$

Designed for vegetation, so not ideal. But we will see it works quite well! This is why the CUNY study uses SAR data from Sentinel-1 instead. However, SAR is a lot more complicated so not suitable for quick-and-dirty workshop :)

Workflow¶

In order to estimate and visualize these indexes for the Palisades, we will go through the following workflow.

Accessing catalogues

  • pystac_client

Browsing and filtering

  • pystac
  • shapely

Loading and processing data

  • odc-stac
  • xarray
  • numpy

Visualizing data

  • ipyleaflet
  • geopandas
  • matplotlib

Part 2B: Coding¶

Install and load libraries¶

In [77]:
import folium
import geopandas as gpd
import ipyleaflet
import matplotlib.pyplot as plt
import pystac_client
import shapely

from IPython.display import Image
from odc.stac import stac_load
from shapely import Polygon
from shapely.geometry import box
from tqdm import tqdm

%load_ext autoreload
%autoreload 2
The autoreload extension is already loaded. To reload it, use:
  %reload_ext autoreload

Load helper functions¶

In [78]:
from utils import *

Access and browse the catalog¶

  • PyStac allows us to directly access some of these resources as they are stored by actors such as AWS, Google, and Microsoft.
  • We will use data as provided by the AWS affiliated company Element84.
  • There are a few other providers that give access to the same data.
In [358]:
sentinel_client = pystac_client.Client.open("https://earth-search.aws.element84.com/v1")
sentinel_client
Out[358]:
  • type "Catalog"
  • id "earth-search-aws"
  • stac_version "1.1.0"
  • description "A STAC API of public datasets on AWS"
  • links[] 21 items
    • 0
      • rel "self"
      • href "https://earth-search.aws.element84.com/v1"
      • type "application/json"
    • 1
      • rel "root"
      • href "https://earth-search.aws.element84.com/v1"
      • type "application/json"
      • title "Earth Search by Element 84"
    • 2
      • rel "conformance"
      • href "https://earth-search.aws.element84.com/v1/conformance"
      • type "application/json"
    • 3
      • rel "data"
      • href "https://earth-search.aws.element84.com/v1/collections"
      • type "application/json"
    • 4
      • rel "search"
      • href "https://earth-search.aws.element84.com/v1/search"
      • type "application/geo+json"
      • method "GET"
    • 5
      • rel "search"
      • href "https://earth-search.aws.element84.com/v1/search"
      • type "application/geo+json"
      • method "POST"
    • 6
      • rel "aggregate"
      • href "https://earth-search.aws.element84.com/v1/aggregate"
      • type "application/json"
      • method "GET"
    • 7
      • rel "aggregations"
      • href "https://earth-search.aws.element84.com/v1/aggregations"
      • type "application/json"
    • 8
      • rel "service-desc"
      • href "https://earth-search.aws.element84.com/v1/api"
      • type "application/vnd.oai.openapi"
    • 9
      • rel "service-doc"
      • href "https://earth-search.aws.element84.com/v1/api.html"
      • type "text/html"
    • 10
      • rel "http://www.opengis.net/def/rel/ogc/1.0/queryables"
      • href "https://earth-search.aws.element84.com/v1/queryables"
      • type "application/schema+json"
    • 11
      • rel "server"
      • href "https://stac-utils.github.io/stac-server/"
      • type "text/html"
    • 12
      • rel "child"
      • href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-pre-c1-l2a"
      • type "application/geo+json"
    • 13
      • rel "child"
      • href "https://earth-search.aws.element84.com/v1/collections/cop-dem-glo-30"
      • type "application/geo+json"
    • 14
      • rel "child"
      • href "https://earth-search.aws.element84.com/v1/collections/naip"
      • type "application/geo+json"
    • 15
      • rel "child"
      • href "https://earth-search.aws.element84.com/v1/collections/cop-dem-glo-90"
      • type "application/geo+json"
    • 16
      • rel "child"
      • href "https://earth-search.aws.element84.com/v1/collections/landsat-c2-l2"
      • type "application/geo+json"
    • 17
      • rel "child"
      • href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l2a"
      • type "application/geo+json"
    • 18
      • rel "child"
      • href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l1c"
      • type "application/geo+json"
    • 19
      • rel "child"
      • href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a"
      • type "application/geo+json"
    • 20
      • rel "child"
      • href "https://earth-search.aws.element84.com/v1/collections/sentinel-1-grd"
      • type "application/geo+json"
  • conformsTo[] 14 items
    • 0 "https://api.stacspec.org/v1.0.0/core"
    • 1 "https://api.stacspec.org/v1.0.0/collections"
    • 2 "https://api.stacspec.org/v1.0.0/ogcapi-features"
    • 3 "https://api.stacspec.org/v1.0.0/item-search"
    • 4 "https://api.stacspec.org/v1.0.0/ogcapi-features#fields"
    • 5 "https://api.stacspec.org/v1.0.0/ogcapi-features#sort"
    • 6 "https://api.stacspec.org/v1.0.0/ogcapi-features#query"
    • 7 "https://api.stacspec.org/v1.0.0/item-search#fields"
    • 8 "https://api.stacspec.org/v1.0.0/item-search#sort"
    • 9 "https://api.stacspec.org/v1.0.0/item-search#query"
    • 10 "https://api.stacspec.org/v0.3.0/aggregation"
    • 11 "http://www.opengis.net/spec/ogcapi-features-1/1.0/conf/core"
    • 12 "http://www.opengis.net/spec/ogcapi-features-1/1.0/conf/oas30"
    • 13 "http://www.opengis.net/spec/ogcapi-features-1/1.0/conf/geojson"
  • title "Earth Search by Element 84"

Once we've established the connection to Element84, we can check what data and from which satellites do we have access to.

In [359]:
collections = list(sentinel_client.get_collections())
n_collections = len(collections)
In [360]:
print(f"There are {n_collections} collections:\n")
for c in collections:
    print(c.id)
There are 9 collections:

sentinel-2-pre-c1-l2a
cop-dem-glo-30
naip
cop-dem-glo-90
landsat-c2-l2
sentinel-2-l2a
sentinel-2-l1c
sentinel-2-c1-l2a
sentinel-1-grd

There are three different satellites

  1. Data from the Sentinel missions of the Copernicus program: sentinel-2-pre-c1-l2a, sentinel-2-l2a, sentinel-2-l1c, sentinel-2-c1-l2a, sentinel-1-grd
  2. Data from the TanDEM-X mission of the Copernicus program: cop-dem-glo-30 & cop-dem-glo-90
  3. Data from the National Agriculture Imagery Program (NAIP): naip
  4. Data from the Landsat program: landsat-c2-l2

Sentinel-2¶

We will use the sentinel-2-l2a dataset. This dataset has a few advantegous properties. It is:

  1. Available at a good resolution. 10 m, 20 m, and 60 m depending on wavelength
  2. Uses a MultiSpectral Instrument (MSI) with 13 bands: 4 visible bands, 6 Near-Infrared bands, 3 Short-Wave Infrared bands
  3. Available at a frequent interval: Collected every 5 days
  4. Available at "l2a", i.e. atmospherically corrected surfance reflectance

Source: https://sentiwiki.copernicus.eu/web/s2-mission

Moreover:

  • It is available at land and coastal areas between latitudes 56°S and 83°N
  • Global data available since January 2017, some local patches since October 2016
In [361]:
collection = "sentinel-2-l2a"

Explore the available data¶

This data is available almost "real time". We can, for instance, easily get data for January and February in February of the year this was written (2025).

In [389]:
date = "2025-02-01/2025-02-25"

Before accessing the satellite data, we have to choose a specific area of interest (AOI). We can use the package ipyleaflet to visualize a point in the Wet'suwet'en territory.

In [390]:
height = 600
width = 1200
In [490]:
m = ipyleaflet.Map()
m.center = 34.05, -118.55
m.zoom = 14
m.layout.height = str(height) + "px"
m.layout.width = str(width) + "px"
m
Out[490]:
Map(center=[34.05, -118.55], controls=(ZoomControl(options=['position', 'zoom_in_text', 'zoom_in_title', 'zoom…

This preview can directly be used to get the "bounding box" (bbox) of our AOI.

In [392]:
bbox=[m.west, m.south, m.east, m.north]

Now, using this bbox and our dates of interest, we can retrieve information about the images that are available for that AOI at that time.

We run our query with three filters we want images with

  1. less than 20% of their pixels missing.
  2. less than 20% degraded spectral data.
  3. less than 20% cloud cover.

Additionally, we recommend the service return only 5 images.

In [491]:
query = ["s2:nodata_pixel_percentage<20",
         "s2:degraded_msi_data_percentage<20",
         "eo:cloud_cover<20"]
In [492]:
%%time
item_search_t1 = sentinel_client.search(collections=[collection], # Filter by collection
                                 datetime=date, # Filter by date
                                 bbox=bbox, # Filter by area
                                 query=query, # Filter by quality
                                 limit=5) # Limit n returned images to 5
CPU times: user 299 µs, sys: 2 µs, total: 301 µs
Wall time: 304 µs

What we get in return is a PyStac ItemSearch. This is like getting the search results of Google. You haven't yet loaded the data of the websites returned by your search, only some data about each website.

Similarly, we now have data about the relevant items, not yet the items nor their assets.

Why? Because these assets are HUGE images! You could easily end up downloading tens of gigabytes by accident.

In [394]:
item_search_t1.item_collection()
Out[394]:
  • type "FeatureCollection"
  • features[] 2 items
    • 0
      • type "Feature"
      • stac_version "1.1.0"
      • stac_extensions[] 8 items
        • 0 "https://stac-extensions.github.io/grid/v1.1.0/schema.json"
        • 1 "https://stac-extensions.github.io/view/v1.0.0/schema.json"
        • 2 "https://stac-extensions.github.io/sentinel-2/v1.0.0/schema.json"
        • 3 "https://stac-extensions.github.io/projection/v2.0.0/schema.json"
        • 4 "https://stac-extensions.github.io/eo/v1.1.0/schema.json"
        • 5 "https://stac-extensions.github.io/raster/v1.1.0/schema.json"
        • 6 "https://stac-extensions.github.io/mgrs/v1.0.0/schema.json"
        • 7 "https://stac-extensions.github.io/processing/v1.1.0/schema.json"
      • id "S2C_11SLT_20250221_0_L2A"
      • geometry
        • type "Polygon"
        • coordinates[] 1 items
          • 0[] 5 items
            • 0[] 2 items
              • 0 -119.17376896599782
              • 1 34.32235671057083
            • 1[] 2 items
              • 0 -119.14885662021419
              • 1 33.33277630652224
            • 2[] 2 items
              • 0 -117.96938626406873
              • 1 33.34758667242361
            • 3[] 2 items
              • 0 -117.98063319821665
              • 1 34.33772750342932
            • 4[] 2 items
              • 0 -119.17376896599782
              • 1 34.32235671057083
      • bbox[] 4 items
        • 0 -119.173769
        • 1 33.332776
        • 2 -117.969386
        • 3 34.337728
      • properties
        • created "2025-02-22T01:53:43.505Z"
        • platform "sentinel-2c"
        • constellation "sentinel-2"
        • instruments[] 1 items
          • 0 "msi"
        • eo:cloud_cover 4.984134
        • proj:code "EPSG:32611"
        • proj:centroid
          • lat 33.83606
          • lon -118.56814
        • mgrs:utm_zone 11
        • mgrs:latitude_band "S"
        • mgrs:grid_square "LT"
        • grid:code "MGRS-11SLT"
        • view:azimuth 102.12176753134347
        • view:incidence_angle 4.749574361931863
        • view:sun_azimuth 152.371295355222
        • view:sun_elevation 41.754986507204
        • s2:tile_id "S2C_OPER_MSI_L2A_TL_2CPS_20250222T001111_A002428_T11SLT_N05.11"
        • s2:degraded_msi_data_percentage 0.0213
        • s2:nodata_pixel_percentage 0
        • s2:saturated_defective_pixel_percentage 0
        • s2:cloud_shadow_percentage 0.002472
        • s2:vegetation_percentage 8.055272
        • s2:not_vegetated_percentage 33.023557
        • s2:water_percentage 53.660136
        • s2:unclassified_percentage 0.036198
        • s2:medium_proba_clouds_percentage 1.612118
        • s2:high_proba_clouds_percentage 2.46034
        • s2:thin_cirrus_percentage 0.911676
        • s2:snow_ice_percentage 0.004967
        • s2:product_type "S2MSI2A"
        • s2:processing_baseline "05.11"
        • s2:product_uri "S2C_MSIL2A_20250221T183421_N0511_R027_T11SLT_20250222T001111.SAFE"
        • s2:generation_time "2025-02-22T00:11:11.000000Z"
        • s2:datatake_id "GS2C_20250221T183421_002428_N05.11"
        • s2:datatake_type "INS-NOBS"
        • s2:datastrip_id "S2C_OPER_MSI_L2A_DS_2CPS_20250222T001111_S20250221T183723_N05.11"
        • s2:reflectance_conversion_factor 1.02408600818865
        • datetime "2025-02-21T18:45:25.463000Z"
        • s2:sequence "0"
        • earthsearch:s3_path "s3://sentinel-cogs/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A"
        • earthsearch:payload_id "roda-sentinel2/workflow-sentinel2-to-stac/a6889564d8b608340f2dfb2ae9d8b496"
        • earthsearch:boa_offset_applied True
        • processing:software
          • sentinel2-to-stac "0.1.1"
        • updated "2025-02-22T01:53:43.505Z"
      • links[] 8 items
        • 0
          • rel "self"
          • href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l2a/items/S2C_11SLT_20250221_0_L2A"
          • type "application/geo+json"
        • 1
          • rel "canonical"
          • href "s3://sentinel-cogs/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/S2C_11SLT_20250221_0_L2A.json"
          • type "application/json"
        • 2
          • rel "license"
          • href "https://sentinel.esa.int/documents/247904/690755/Sentinel_Data_Legal_Notice"
        • 3
          • rel "derived_from"
          • href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l1c/items/S2C_11SLT_20250221_0_L1C"
          • type "application/geo+json"
        • 4
          • rel "parent"
          • href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l2a"
          • type "application/json"
        • 5
          • rel "collection"
          • href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l2a"
          • type "application/json"
        • 6
          • rel "root"
          • href "https://earth-search.aws.element84.com/v1"
          • type "application/json"
          • title "Earth Search by Element 84"
        • 7
          • rel "thumbnail"
          • href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l2a/items/S2C_11SLT_20250221_0_L2A/thumbnail"
      • assets
        • aot
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/AOT.tif"
          • type "image/tiff; application=geotiff; profile=cloud-optimized"
          • title "Aerosol optical thickness (AOT)"
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 20
              • scale 0.001
              • offset 0
          • roles[] 1 items
            • 0 "data"
        • blue
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B02.tif"
          • type "image/tiff; application=geotiff; profile=cloud-optimized"
          • title "Blue - 10m"
          • eo:bands[] 1 items
            • 0
              • name "B02"
              • common_name "blue"
              • center_wavelength 0.49
              • full_width_half_max 0.098
          • gsd 10
          • proj:shape[] 2 items
            • 0 10980
            • 1 10980
          • proj:transform[] 6 items
            • 0 10
            • 1 0
            • 2 300000
            • 3 0
            • 4 -10
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 10
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • cloud
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/qi/CLD_20m.jp2"
          • type "image/jp2"
          • title "Cloud Probabilities"
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint8"
              • spatial_resolution 20
          • roles[] 2 items
            • 0 "data"
            • 1 "cloud"
        • coastal
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B01.tif"
          • type "image/tiff; application=geotiff; profile=cloud-optimized"
          • title "Coastal - 60m"
          • eo:bands[] 1 items
            • 0
              • name "B01"
              • common_name "coastal"
              • center_wavelength 0.443
              • full_width_half_max 0.027
          • gsd 60
          • proj:shape[] 2 items
            • 0 1830
            • 1 1830
          • proj:transform[] 6 items
            • 0 60
            • 1 0
            • 2 300000
            • 3 0
            • 4 -60
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 60
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • granule_metadata
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/granule_metadata.xml"
          • type "application/xml"
          • roles[] 1 items
            • 0 "metadata"
        • green
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B03.tif"
          • type "image/tiff; application=geotiff; profile=cloud-optimized"
          • title "Green - 10m"
          • eo:bands[] 1 items
            • 0
              • name "B03"
              • common_name "green"
              • center_wavelength 0.56
              • full_width_half_max 0.045
          • gsd 10
          • proj:shape[] 2 items
            • 0 10980
            • 1 10980
          • proj:transform[] 6 items
            • 0 10
            • 1 0
            • 2 300000
            • 3 0
            • 4 -10
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 10
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • nir
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B08.tif"
          • type "image/tiff; application=geotiff; profile=cloud-optimized"
          • title "NIR 1 - 10m"
          • eo:bands[] 1 items
            • 0
              • name "B08"
              • common_name "nir"
              • center_wavelength 0.842
              • full_width_half_max 0.145
          • gsd 10
          • proj:shape[] 2 items
            • 0 10980
            • 1 10980
          • proj:transform[] 6 items
            • 0 10
            • 1 0
            • 2 300000
            • 3 0
            • 4 -10
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 10
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • nir08
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B8A.tif"
          • type "image/tiff; application=geotiff; profile=cloud-optimized"
          • title "NIR 2 - 20m"
          • eo:bands[] 1 items
            • 0
              • name "B8A"
              • common_name "nir08"
              • center_wavelength 0.865
              • full_width_half_max 0.033
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 20
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • nir09
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B09.tif"
          • type "image/tiff; application=geotiff; profile=cloud-optimized"
          • title "NIR 3 - 60m"
          • eo:bands[] 1 items
            • 0
              • name "B09"
              • common_name "nir09"
              • center_wavelength 0.945
              • full_width_half_max 0.026
          • gsd 60
          • proj:shape[] 2 items
            • 0 1830
            • 1 1830
          • proj:transform[] 6 items
            • 0 60
            • 1 0
            • 2 300000
            • 3 0
            • 4 -60
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 60
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • product_metadata
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/product_metadata.xml"
          • type "application/xml"
          • roles[] 1 items
            • 0 "metadata"
        • red
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B04.tif"
          • type "image/tiff; application=geotiff; profile=cloud-optimized"
          • title "Red - 10m"
          • eo:bands[] 1 items
            • 0
              • name "B04"
              • common_name "red"
              • center_wavelength 0.665
              • full_width_half_max 0.038
          • gsd 10
          • proj:shape[] 2 items
            • 0 10980
            • 1 10980
          • proj:transform[] 6 items
            • 0 10
            • 1 0
            • 2 300000
            • 3 0
            • 4 -10
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 10
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • rededge1
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B05.tif"
          • type "image/tiff; application=geotiff; profile=cloud-optimized"
          • title "Red Edge 1 - 20m"
          • eo:bands[] 1 items
            • 0
              • name "B05"
              • common_name "rededge"
              • center_wavelength 0.704
              • full_width_half_max 0.019
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 20
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • rededge2
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B06.tif"
          • type "image/tiff; application=geotiff; profile=cloud-optimized"
          • title "Red Edge 2 - 20m"
          • eo:bands[] 1 items
            • 0
              • name "B06"
              • common_name "rededge"
              • center_wavelength 0.74
              • full_width_half_max 0.018
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 20
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • rededge3
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B07.tif"
          • type "image/tiff; application=geotiff; profile=cloud-optimized"
          • title "Red Edge 3 - 20m"
          • eo:bands[] 1 items
            • 0
              • name "B07"
              • common_name "rededge"
              • center_wavelength 0.783
              • full_width_half_max 0.028
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 20
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • scl
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/SCL.tif"
          • type "image/tiff; application=geotiff; profile=cloud-optimized"
          • title "Scene classification map (SCL)"
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint8"
              • spatial_resolution 20
          • roles[] 1 items
            • 0 "data"
        • snow
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/qi/SNW_20m.jp2"
          • type "image/jp2"
          • title "Snow Probabilities"
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint8"
              • spatial_resolution 20
          • roles[] 2 items
            • 0 "data"
            • 1 "snow-ice"
        • swir16
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B11.tif"
          • type "image/tiff; application=geotiff; profile=cloud-optimized"
          • title "SWIR 1.6μm - 20m"
          • eo:bands[] 1 items
            • 0
              • name "B11"
              • common_name "swir16"
              • center_wavelength 1.61
              • full_width_half_max 0.143
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 20
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • swir22
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B12.tif"
          • type "image/tiff; application=geotiff; profile=cloud-optimized"
          • title "SWIR 2.2μm - 20m"
          • eo:bands[] 1 items
            • 0
              • name "B12"
              • common_name "swir22"
              • center_wavelength 2.19
              • full_width_half_max 0.242
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 20
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • tileinfo_metadata
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/tileinfo_metadata.json"
          • type "application/json"
          • roles[] 1 items
            • 0 "metadata"
        • visual
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/TCI.tif"
          • type "image/tiff; application=geotiff; profile=cloud-optimized"
          • title "True color image"
          • eo:bands[] 3 items
            • 0
              • name "B04"
              • common_name "red"
              • center_wavelength 0.665
              • full_width_half_max 0.038
            • 1
              • name "B03"
              • common_name "green"
              • center_wavelength 0.56
              • full_width_half_max 0.045
            • 2
              • name "B02"
              • common_name "blue"
              • center_wavelength 0.49
              • full_width_half_max 0.098
          • raster:bands[] 3 items
            • 0
              • nodata 0
              • data_type "uint8"
              • spatial_resolution 10
            • 1
              • nodata 0
              • data_type "uint8"
              • spatial_resolution 10
            • 2
              • nodata 0
              • data_type "uint8"
              • spatial_resolution 10
          • gsd 10
          • proj:shape[] 2 items
            • 0 10980
            • 1 10980
          • proj:transform[] 6 items
            • 0 10
            • 1 0
            • 2 300000
            • 3 0
            • 4 -10
            • 5 3800040
          • roles[] 1 items
            • 0 "visual"
        • wvp
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/WVP.tif"
          • type "image/tiff; application=geotiff; profile=cloud-optimized"
          • title "Water Vapour (WVP)"
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 20
              • unit "cm"
              • scale 0.001
              • offset 0
          • roles[] 1 items
            • 0 "data"
        • thumbnail
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/preview.jpg"
          • type "image/jpeg"
          • title "Thumbnail of preview image"
          • roles[] 1 items
            • 0 "thumbnail"
        • aot-jp2
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/AOT.jp2"
          • type "image/jp2"
          • title "Aerosol optical thickness (AOT)"
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 20
              • scale 0.001
              • offset 0
          • roles[] 1 items
            • 0 "data"
        • blue-jp2
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R10m/B02.jp2"
          • type "image/jp2"
          • title "Blue - 10m"
          • eo:bands[] 1 items
            • 0
              • name "B02"
              • common_name "blue"
              • center_wavelength 0.49
              • full_width_half_max 0.098
          • gsd 10
          • proj:shape[] 2 items
            • 0 10980
            • 1 10980
          • proj:transform[] 6 items
            • 0 10
            • 1 0
            • 2 300000
            • 3 0
            • 4 -10
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 10
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • coastal-jp2
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R60m/B01.jp2"
          • type "image/jp2"
          • title "Coastal - 60m"
          • eo:bands[] 1 items
            • 0
              • name "B01"
              • common_name "coastal"
              • center_wavelength 0.443
              • full_width_half_max 0.027
          • gsd 60
          • proj:shape[] 2 items
            • 0 1830
            • 1 1830
          • proj:transform[] 6 items
            • 0 60
            • 1 0
            • 2 300000
            • 3 0
            • 4 -60
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 60
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • green-jp2
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R10m/B03.jp2"
          • type "image/jp2"
          • title "Green - 10m"
          • eo:bands[] 1 items
            • 0
              • name "B03"
              • common_name "green"
              • center_wavelength 0.56
              • full_width_half_max 0.045
          • gsd 10
          • proj:shape[] 2 items
            • 0 10980
            • 1 10980
          • proj:transform[] 6 items
            • 0 10
            • 1 0
            • 2 300000
            • 3 0
            • 4 -10
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 10
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • nir-jp2
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R10m/B08.jp2"
          • type "image/jp2"
          • title "NIR 1 - 10m"
          • eo:bands[] 1 items
            • 0
              • name "B08"
              • common_name "nir"
              • center_wavelength 0.842
              • full_width_half_max 0.145
          • gsd 10
          • proj:shape[] 2 items
            • 0 10980
            • 1 10980
          • proj:transform[] 6 items
            • 0 10
            • 1 0
            • 2 300000
            • 3 0
            • 4 -10
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 10
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • nir08-jp2
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/B8A.jp2"
          • type "image/jp2"
          • title "NIR 2 - 20m"
          • eo:bands[] 1 items
            • 0
              • name "B8A"
              • common_name "nir08"
              • center_wavelength 0.865
              • full_width_half_max 0.033
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 20
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • nir09-jp2
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R60m/B09.jp2"
          • type "image/jp2"
          • title "NIR 3 - 60m"
          • eo:bands[] 1 items
            • 0
              • name "B09"
              • common_name "nir09"
              • center_wavelength 0.945
              • full_width_half_max 0.026
          • gsd 60
          • proj:shape[] 2 items
            • 0 1830
            • 1 1830
          • proj:transform[] 6 items
            • 0 60
            • 1 0
            • 2 300000
            • 3 0
            • 4 -60
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 60
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • red-jp2
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R10m/B04.jp2"
          • type "image/jp2"
          • title "Red - 10m"
          • eo:bands[] 1 items
            • 0
              • name "B04"
              • common_name "red"
              • center_wavelength 0.665
              • full_width_half_max 0.038
          • gsd 10
          • proj:shape[] 2 items
            • 0 10980
            • 1 10980
          • proj:transform[] 6 items
            • 0 10
            • 1 0
            • 2 300000
            • 3 0
            • 4 -10
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 10
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • rededge1-jp2
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/B05.jp2"
          • type "image/jp2"
          • title "Red Edge 1 - 20m"
          • eo:bands[] 1 items
            • 0
              • name "B05"
              • common_name "rededge"
              • center_wavelength 0.704
              • full_width_half_max 0.019
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 20
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • rededge2-jp2
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/B06.jp2"
          • type "image/jp2"
          • title "Red Edge 2 - 20m"
          • eo:bands[] 1 items
            • 0
              • name "B06"
              • common_name "rededge"
              • center_wavelength 0.74
              • full_width_half_max 0.018
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 20
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • rededge3-jp2
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/B07.jp2"
          • type "image/jp2"
          • title "Red Edge 3 - 20m"
          • eo:bands[] 1 items
            • 0
              • name "B07"
              • common_name "rededge"
              • center_wavelength 0.783
              • full_width_half_max 0.028
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 20
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • scl-jp2
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/SCL.jp2"
          • type "image/jp2"
          • title "Scene classification map (SCL)"
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint8"
              • spatial_resolution 20
          • roles[] 1 items
            • 0 "data"
        • swir16-jp2
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/B11.jp2"
          • type "image/jp2"
          • title "SWIR 1.6μm - 20m"
          • eo:bands[] 1 items
            • 0
              • name "B11"
              • common_name "swir16"
              • center_wavelength 1.61
              • full_width_half_max 0.143
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 20
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • swir22-jp2
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/B12.jp2"
          • type "image/jp2"
          • title "SWIR 2.2μm - 20m"
          • eo:bands[] 1 items
            • 0
              • name "B12"
              • common_name "swir22"
              • center_wavelength 2.19
              • full_width_half_max 0.242
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 20
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • visual-jp2
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R10m/TCI.jp2"
          • type "image/jp2"
          • title "True color image"
          • eo:bands[] 3 items
            • 0
              • name "B04"
              • common_name "red"
              • center_wavelength 0.665
              • full_width_half_max 0.038
            • 1
              • name "B03"
              • common_name "green"
              • center_wavelength 0.56
              • full_width_half_max 0.045
            • 2
              • name "B02"
              • common_name "blue"
              • center_wavelength 0.49
              • full_width_half_max 0.098
          • raster:bands[] 3 items
            • 0
              • nodata 0
              • data_type "uint8"
              • spatial_resolution 10
            • 1
              • nodata 0
              • data_type "uint8"
              • spatial_resolution 10
            • 2
              • nodata 0
              • data_type "uint8"
              • spatial_resolution 10
          • gsd 10
          • proj:shape[] 2 items
            • 0 10980
            • 1 10980
          • proj:transform[] 6 items
            • 0 10
            • 1 0
            • 2 300000
            • 3 0
            • 4 -10
            • 5 3800040
          • roles[] 1 items
            • 0 "visual"
        • wvp-jp2
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/WVP.jp2"
          • type "image/jp2"
          • title "Water Vapour (WVP)"
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 20
              • unit "cm"
              • scale 0.001
              • offset 0
          • roles[] 1 items
            • 0 "data"
      • collection "sentinel-2-l2a"
    • 1
      • type "Feature"
      • stac_version "1.1.0"
      • stac_extensions[] 8 items
        • 0 "https://stac-extensions.github.io/mgrs/v1.0.0/schema.json"
        • 1 "https://stac-extensions.github.io/processing/v1.1.0/schema.json"
        • 2 "https://stac-extensions.github.io/projection/v2.0.0/schema.json"
        • 3 "https://stac-extensions.github.io/view/v1.0.0/schema.json"
        • 4 "https://stac-extensions.github.io/grid/v1.1.0/schema.json"
        • 5 "https://stac-extensions.github.io/sentinel-2/v1.0.0/schema.json"
        • 6 "https://stac-extensions.github.io/raster/v1.1.0/schema.json"
        • 7 "https://stac-extensions.github.io/eo/v1.1.0/schema.json"
      • id "S2C_11SLT_20250201_0_L2A"
      • geometry
        • type "Polygon"
        • coordinates[] 1 items
          • 0[] 5 items
            • 0[] 2 items
              • 0 -119.17376896599782
              • 1 34.32235671057083
            • 1[] 2 items
              • 0 -119.14885662021419
              • 1 33.33277630652224
            • 2[] 2 items
              • 0 -117.96938626406873
              • 1 33.34758667242361
            • 3[] 2 items
              • 0 -117.98063319821665
              • 1 34.33772750342932
            • 4[] 2 items
              • 0 -119.17376896599782
              • 1 34.32235671057083
      • bbox[] 4 items
        • 0 -119.173769
        • 1 33.332776
        • 2 -117.969386
        • 3 34.337728
      • properties
        • created "2025-02-19T00:09:21.000Z"
        • platform "sentinel-2c"
        • constellation "sentinel-2"
        • instruments[] 1 items
          • 0 "msi"
        • eo:cloud_cover 15.756986
        • proj:code "EPSG:32611"
        • proj:centroid
          • lat 33.83606
          • lon -118.56814
        • mgrs:utm_zone 11
        • mgrs:latitude_band "S"
        • mgrs:grid_square "LT"
        • grid:code "MGRS-11SLT"
        • view:azimuth 102.54679884013262
        • view:incidence_angle 4.643661733025623
        • view:sun_azimuth 155.533090805397
        • view:sun_elevation 35.6300744226208
        • s2:tile_id "S2C_OPER_MSI_L2A_TL_2CPS_20250201T210315_A002142_T11SLT_N05.11"
        • s2:degraded_msi_data_percentage 0.0213
        • s2:nodata_pixel_percentage 0
        • s2:saturated_defective_pixel_percentage 0
        • s2:cloud_shadow_percentage 0.311144
        • s2:vegetation_percentage 6.128278
        • s2:not_vegetated_percentage 28.111815
        • s2:water_percentage 48.687729
        • s2:unclassified_percentage 0.019642
        • s2:medium_proba_clouds_percentage 1.772476
        • s2:high_proba_clouds_percentage 0.166605
        • s2:thin_cirrus_percentage 13.817903
        • s2:snow_ice_percentage 0.0122
        • s2:product_type "S2MSI2A"
        • s2:processing_baseline "05.11"
        • s2:product_uri "S2C_MSIL2A_20250201T183631_N0511_R027_T11SLT_20250201T210315.SAFE"
        • s2:generation_time "2025-02-01T21:03:15.000000Z"
        • s2:datatake_id "GS2C_20250201T183631_002142_N05.11"
        • s2:datatake_type "INS-NOBS"
        • s2:datastrip_id "S2C_OPER_MSI_L2A_DS_2CPS_20250201T210315_S20250201T184431_N05.11"
        • s2:reflectance_conversion_factor 1.03095298204146
        • datetime "2025-02-01T18:45:30.242000Z"
        • s2:sequence "0"
        • earthsearch:s3_path "s3://sentinel-cogs/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A"
        • earthsearch:payload_id "roda-sentinel2/workflow-sentinel2-to-stac/64ae91a21d030b823f41a5305c24b91e"
        • earthsearch:boa_offset_applied True
        • processing:software
          • sentinel2-to-stac "0.1.1"
        • updated "2025-02-19T00:09:21.000Z"
      • links[] 8 items
        • 0
          • rel "self"
          • href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l2a/items/S2C_11SLT_20250201_0_L2A"
          • type "application/geo+json"
        • 1
          • rel "canonical"
          • href "s3://sentinel-cogs/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/S2C_11SLT_20250201_0_L2A.json"
          • type "application/json"
        • 2
          • rel "license"
          • href "https://sentinel.esa.int/documents/247904/690755/Sentinel_Data_Legal_Notice"
        • 3
          • rel "derived_from"
          • href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l1c/items/S2C_11SLT_20250201_0_L1C"
          • type "application/geo+json"
        • 4
          • rel "parent"
          • href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l2a"
          • type "application/json"
        • 5
          • rel "collection"
          • href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l2a"
          • type "application/json"
        • 6
          • rel "root"
          • href "https://earth-search.aws.element84.com/v1"
          • type "application/json"
          • title "Earth Search by Element 84"
        • 7
          • rel "thumbnail"
          • href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l2a/items/S2C_11SLT_20250201_0_L2A/thumbnail"
      • assets
        • aot
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/AOT.tif"
          • type "image/tiff; application=geotiff; profile=cloud-optimized"
          • title "Aerosol optical thickness (AOT)"
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 20
              • scale 0.001
              • offset 0
          • roles[] 1 items
            • 0 "data"
        • blue
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/B02.tif"
          • type "image/tiff; application=geotiff; profile=cloud-optimized"
          • title "Blue - 10m"
          • eo:bands[] 1 items
            • 0
              • name "B02"
              • common_name "blue"
              • center_wavelength 0.49
              • full_width_half_max 0.098
          • gsd 10
          • proj:shape[] 2 items
            • 0 10980
            • 1 10980
          • proj:transform[] 6 items
            • 0 10
            • 1 0
            • 2 300000
            • 3 0
            • 4 -10
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 10
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • cloud
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/qi/CLD_20m.jp2"
          • type "image/jp2"
          • title "Cloud Probabilities"
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint8"
              • spatial_resolution 20
          • roles[] 2 items
            • 0 "data"
            • 1 "cloud"
        • coastal
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/B01.tif"
          • type "image/tiff; application=geotiff; profile=cloud-optimized"
          • title "Coastal - 60m"
          • eo:bands[] 1 items
            • 0
              • name "B01"
              • common_name "coastal"
              • center_wavelength 0.443
              • full_width_half_max 0.027
          • gsd 60
          • proj:shape[] 2 items
            • 0 1830
            • 1 1830
          • proj:transform[] 6 items
            • 0 60
            • 1 0
            • 2 300000
            • 3 0
            • 4 -60
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 60
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • granule_metadata
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/granule_metadata.xml"
          • type "application/xml"
          • roles[] 1 items
            • 0 "metadata"
        • green
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/B03.tif"
          • type "image/tiff; application=geotiff; profile=cloud-optimized"
          • title "Green - 10m"
          • eo:bands[] 1 items
            • 0
              • name "B03"
              • common_name "green"
              • center_wavelength 0.56
              • full_width_half_max 0.045
          • gsd 10
          • proj:shape[] 2 items
            • 0 10980
            • 1 10980
          • proj:transform[] 6 items
            • 0 10
            • 1 0
            • 2 300000
            • 3 0
            • 4 -10
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 10
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • nir
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/B08.tif"
          • type "image/tiff; application=geotiff; profile=cloud-optimized"
          • title "NIR 1 - 10m"
          • eo:bands[] 1 items
            • 0
              • name "B08"
              • common_name "nir"
              • center_wavelength 0.842
              • full_width_half_max 0.145
          • gsd 10
          • proj:shape[] 2 items
            • 0 10980
            • 1 10980
          • proj:transform[] 6 items
            • 0 10
            • 1 0
            • 2 300000
            • 3 0
            • 4 -10
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 10
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • nir08
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/B8A.tif"
          • type "image/tiff; application=geotiff; profile=cloud-optimized"
          • title "NIR 2 - 20m"
          • eo:bands[] 1 items
            • 0
              • name "B8A"
              • common_name "nir08"
              • center_wavelength 0.865
              • full_width_half_max 0.033
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 20
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • nir09
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/B09.tif"
          • type "image/tiff; application=geotiff; profile=cloud-optimized"
          • title "NIR 3 - 60m"
          • eo:bands[] 1 items
            • 0
              • name "B09"
              • common_name "nir09"
              • center_wavelength 0.945
              • full_width_half_max 0.026
          • gsd 60
          • proj:shape[] 2 items
            • 0 1830
            • 1 1830
          • proj:transform[] 6 items
            • 0 60
            • 1 0
            • 2 300000
            • 3 0
            • 4 -60
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 60
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • product_metadata
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/product_metadata.xml"
          • type "application/xml"
          • roles[] 1 items
            • 0 "metadata"
        • red
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/B04.tif"
          • type "image/tiff; application=geotiff; profile=cloud-optimized"
          • title "Red - 10m"
          • eo:bands[] 1 items
            • 0
              • name "B04"
              • common_name "red"
              • center_wavelength 0.665
              • full_width_half_max 0.038
          • gsd 10
          • proj:shape[] 2 items
            • 0 10980
            • 1 10980
          • proj:transform[] 6 items
            • 0 10
            • 1 0
            • 2 300000
            • 3 0
            • 4 -10
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 10
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • rededge1
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/B05.tif"
          • type "image/tiff; application=geotiff; profile=cloud-optimized"
          • title "Red Edge 1 - 20m"
          • eo:bands[] 1 items
            • 0
              • name "B05"
              • common_name "rededge"
              • center_wavelength 0.704
              • full_width_half_max 0.019
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 20
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • rededge2
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/B06.tif"
          • type "image/tiff; application=geotiff; profile=cloud-optimized"
          • title "Red Edge 2 - 20m"
          • eo:bands[] 1 items
            • 0
              • name "B06"
              • common_name "rededge"
              • center_wavelength 0.74
              • full_width_half_max 0.018
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 20
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • rededge3
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/B07.tif"
          • type "image/tiff; application=geotiff; profile=cloud-optimized"
          • title "Red Edge 3 - 20m"
          • eo:bands[] 1 items
            • 0
              • name "B07"
              • common_name "rededge"
              • center_wavelength 0.783
              • full_width_half_max 0.028
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 20
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • scl
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/SCL.tif"
          • type "image/tiff; application=geotiff; profile=cloud-optimized"
          • title "Scene classification map (SCL)"
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint8"
              • spatial_resolution 20
          • roles[] 1 items
            • 0 "data"
        • snow
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/qi/SNW_20m.jp2"
          • type "image/jp2"
          • title "Snow Probabilities"
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint8"
              • spatial_resolution 20
          • roles[] 2 items
            • 0 "data"
            • 1 "snow-ice"
        • swir16
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/B11.tif"
          • type "image/tiff; application=geotiff; profile=cloud-optimized"
          • title "SWIR 1.6μm - 20m"
          • eo:bands[] 1 items
            • 0
              • name "B11"
              • common_name "swir16"
              • center_wavelength 1.61
              • full_width_half_max 0.143
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 20
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • swir22
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/B12.tif"
          • type "image/tiff; application=geotiff; profile=cloud-optimized"
          • title "SWIR 2.2μm - 20m"
          • eo:bands[] 1 items
            • 0
              • name "B12"
              • common_name "swir22"
              • center_wavelength 2.19
              • full_width_half_max 0.242
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 20
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • tileinfo_metadata
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/tileinfo_metadata.json"
          • type "application/json"
          • roles[] 1 items
            • 0 "metadata"
        • visual
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/TCI.tif"
          • type "image/tiff; application=geotiff; profile=cloud-optimized"
          • title "True color image"
          • eo:bands[] 3 items
            • 0
              • name "B04"
              • common_name "red"
              • center_wavelength 0.665
              • full_width_half_max 0.038
            • 1
              • name "B03"
              • common_name "green"
              • center_wavelength 0.56
              • full_width_half_max 0.045
            • 2
              • name "B02"
              • common_name "blue"
              • center_wavelength 0.49
              • full_width_half_max 0.098
          • raster:bands[] 3 items
            • 0
              • nodata 0
              • data_type "uint8"
              • spatial_resolution 10
            • 1
              • nodata 0
              • data_type "uint8"
              • spatial_resolution 10
            • 2
              • nodata 0
              • data_type "uint8"
              • spatial_resolution 10
          • gsd 10
          • proj:shape[] 2 items
            • 0 10980
            • 1 10980
          • proj:transform[] 6 items
            • 0 10
            • 1 0
            • 2 300000
            • 3 0
            • 4 -10
            • 5 3800040
          • roles[] 1 items
            • 0 "visual"
        • wvp
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/WVP.tif"
          • type "image/tiff; application=geotiff; profile=cloud-optimized"
          • title "Water Vapour (WVP)"
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 20
              • unit "cm"
              • scale 0.001
              • offset 0
          • roles[] 1 items
            • 0 "data"
        • thumbnail
          • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/preview.jpg"
          • type "image/jpeg"
          • title "Thumbnail of preview image"
          • roles[] 1 items
            • 0 "thumbnail"
        • aot-jp2
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/R20m/AOT.jp2"
          • type "image/jp2"
          • title "Aerosol optical thickness (AOT)"
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 20
              • scale 0.001
              • offset 0
          • roles[] 1 items
            • 0 "data"
        • blue-jp2
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/R10m/B02.jp2"
          • type "image/jp2"
          • title "Blue - 10m"
          • eo:bands[] 1 items
            • 0
              • name "B02"
              • common_name "blue"
              • center_wavelength 0.49
              • full_width_half_max 0.098
          • gsd 10
          • proj:shape[] 2 items
            • 0 10980
            • 1 10980
          • proj:transform[] 6 items
            • 0 10
            • 1 0
            • 2 300000
            • 3 0
            • 4 -10
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 10
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • coastal-jp2
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/R60m/B01.jp2"
          • type "image/jp2"
          • title "Coastal - 60m"
          • eo:bands[] 1 items
            • 0
              • name "B01"
              • common_name "coastal"
              • center_wavelength 0.443
              • full_width_half_max 0.027
          • gsd 60
          • proj:shape[] 2 items
            • 0 1830
            • 1 1830
          • proj:transform[] 6 items
            • 0 60
            • 1 0
            • 2 300000
            • 3 0
            • 4 -60
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 60
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • green-jp2
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/R10m/B03.jp2"
          • type "image/jp2"
          • title "Green - 10m"
          • eo:bands[] 1 items
            • 0
              • name "B03"
              • common_name "green"
              • center_wavelength 0.56
              • full_width_half_max 0.045
          • gsd 10
          • proj:shape[] 2 items
            • 0 10980
            • 1 10980
          • proj:transform[] 6 items
            • 0 10
            • 1 0
            • 2 300000
            • 3 0
            • 4 -10
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 10
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • nir-jp2
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/R10m/B08.jp2"
          • type "image/jp2"
          • title "NIR 1 - 10m"
          • eo:bands[] 1 items
            • 0
              • name "B08"
              • common_name "nir"
              • center_wavelength 0.842
              • full_width_half_max 0.145
          • gsd 10
          • proj:shape[] 2 items
            • 0 10980
            • 1 10980
          • proj:transform[] 6 items
            • 0 10
            • 1 0
            • 2 300000
            • 3 0
            • 4 -10
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 10
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • nir08-jp2
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/R20m/B8A.jp2"
          • type "image/jp2"
          • title "NIR 2 - 20m"
          • eo:bands[] 1 items
            • 0
              • name "B8A"
              • common_name "nir08"
              • center_wavelength 0.865
              • full_width_half_max 0.033
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 20
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • nir09-jp2
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/R60m/B09.jp2"
          • type "image/jp2"
          • title "NIR 3 - 60m"
          • eo:bands[] 1 items
            • 0
              • name "B09"
              • common_name "nir09"
              • center_wavelength 0.945
              • full_width_half_max 0.026
          • gsd 60
          • proj:shape[] 2 items
            • 0 1830
            • 1 1830
          • proj:transform[] 6 items
            • 0 60
            • 1 0
            • 2 300000
            • 3 0
            • 4 -60
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 60
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • red-jp2
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/R10m/B04.jp2"
          • type "image/jp2"
          • title "Red - 10m"
          • eo:bands[] 1 items
            • 0
              • name "B04"
              • common_name "red"
              • center_wavelength 0.665
              • full_width_half_max 0.038
          • gsd 10
          • proj:shape[] 2 items
            • 0 10980
            • 1 10980
          • proj:transform[] 6 items
            • 0 10
            • 1 0
            • 2 300000
            • 3 0
            • 4 -10
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 10
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • rededge1-jp2
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/R20m/B05.jp2"
          • type "image/jp2"
          • title "Red Edge 1 - 20m"
          • eo:bands[] 1 items
            • 0
              • name "B05"
              • common_name "rededge"
              • center_wavelength 0.704
              • full_width_half_max 0.019
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 20
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • rededge2-jp2
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/R20m/B06.jp2"
          • type "image/jp2"
          • title "Red Edge 2 - 20m"
          • eo:bands[] 1 items
            • 0
              • name "B06"
              • common_name "rededge"
              • center_wavelength 0.74
              • full_width_half_max 0.018
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 20
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • rededge3-jp2
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/R20m/B07.jp2"
          • type "image/jp2"
          • title "Red Edge 3 - 20m"
          • eo:bands[] 1 items
            • 0
              • name "B07"
              • common_name "rededge"
              • center_wavelength 0.783
              • full_width_half_max 0.028
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 20
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • scl-jp2
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/R20m/SCL.jp2"
          • type "image/jp2"
          • title "Scene classification map (SCL)"
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint8"
              • spatial_resolution 20
          • roles[] 1 items
            • 0 "data"
        • swir16-jp2
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/R20m/B11.jp2"
          • type "image/jp2"
          • title "SWIR 1.6μm - 20m"
          • eo:bands[] 1 items
            • 0
              • name "B11"
              • common_name "swir16"
              • center_wavelength 1.61
              • full_width_half_max 0.143
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 20
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • swir22-jp2
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/R20m/B12.jp2"
          • type "image/jp2"
          • title "SWIR 2.2μm - 20m"
          • eo:bands[] 1 items
            • 0
              • name "B12"
              • common_name "swir22"
              • center_wavelength 2.19
              • full_width_half_max 0.242
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 20
              • scale 0.0001
              • offset -0.1
          • roles[] 2 items
            • 0 "data"
            • 1 "reflectance"
        • visual-jp2
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/R10m/TCI.jp2"
          • type "image/jp2"
          • title "True color image"
          • eo:bands[] 3 items
            • 0
              • name "B04"
              • common_name "red"
              • center_wavelength 0.665
              • full_width_half_max 0.038
            • 1
              • name "B03"
              • common_name "green"
              • center_wavelength 0.56
              • full_width_half_max 0.045
            • 2
              • name "B02"
              • common_name "blue"
              • center_wavelength 0.49
              • full_width_half_max 0.098
          • raster:bands[] 3 items
            • 0
              • nodata 0
              • data_type "uint8"
              • spatial_resolution 10
            • 1
              • nodata 0
              • data_type "uint8"
              • spatial_resolution 10
            • 2
              • nodata 0
              • data_type "uint8"
              • spatial_resolution 10
          • gsd 10
          • proj:shape[] 2 items
            • 0 10980
            • 1 10980
          • proj:transform[] 6 items
            • 0 10
            • 1 0
            • 2 300000
            • 3 0
            • 4 -10
            • 5 3800040
          • roles[] 1 items
            • 0 "visual"
        • wvp-jp2
          • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/R20m/WVP.jp2"
          • type "image/jp2"
          • title "Water Vapour (WVP)"
          • gsd 20
          • proj:shape[] 2 items
            • 0 5490
            • 1 5490
          • proj:transform[] 6 items
            • 0 20
            • 1 0
            • 2 300000
            • 3 0
            • 4 -20
            • 5 3800040
          • raster:bands[] 1 items
            • 0
              • nodata 0
              • data_type "uint16"
              • spatial_resolution 20
              • unit "cm"
              • scale 0.001
              • offset 0
          • roles[] 1 items
            • 0 "data"
      • collection "sentinel-2-l2a"
In [395]:
item_collection_t1 = item_search_t1.item_collection()
In [396]:
n_items_t1 = len(item_collection_t1)
n_items_t1
Out[396]:
2

Before downloading the actual images, we can use the geopandas, shapely, and folium packages the size and various properties of our images of interest.

Here, we look at the water percentage of each image. It's an arbitrary attribute, but it shows how the images correspond to the underlying map.

In [397]:
gdf = gpd.GeoDataFrame.from_features(
    item_collection_t1.to_dict(), 
    crs="EPSG:4326"
)
bbox_geom = shapely.geometry.mapping(shapely.geometry.box(*bbox))
bbox_layer = folium.GeoJson(bbox_geom)

m = gdf.explore(column="eo:cloud_cover")
bbox_layer.add_to(m)
m
Out[397]:
Make this Notebook Trusted to load map: File -> Trust Notebook

The search itself is a generator object that includes metadata for all the items returned for the query.

In [398]:
item_search_t1.items()
Out[398]:
<generator object ItemSearch.items at 0x15aa9fbc0>
In [399]:
list(item_search_t1.items())
Out[399]:
[<Item id=S2C_11SLT_20250221_0_L2A>, <Item id=S2C_11SLT_20250201_0_L2A>]

Using a custom function, we can print some attributes of each image.

In [400]:
print_item_search_attributes(item_search_t1)
2 items found:

ID: S2C_11SLT_20250221_0_L2A 
 Cloud cover (%): 4.984134 
 Missing pixels (%): 0 
 Missing band data (%): 0.0213 
 Image area (km^2): 1.17 

ID: S2C_11SLT_20250201_0_L2A 
 Cloud cover (%): 15.756986 
 Missing pixels (%): 0 
 Missing band data (%): 0.0213 
 Image area (km^2): 1.17 

Time 1: Working with one item¶

Before working with the whole set of items, let's take a look at just one image. We'll pick the one with the least cloud cover. This is our "$t_1$", data from the current moment or "time one".

In [401]:
items_t1 = list(item_collection_t1)
In [402]:
min_cloud_t1 = get_item_with_min_attribute(items_t1, attr='eo:cloud_cover')
min_cloud_t1.properties['datetime']
Out[402]:
'2025-02-21T18:45:25.463000Z'

Before loading the item, we can access a low resolution "thumbnail" image to preview it.

In [403]:
Image(url=min_cloud_t1.assets["thumbnail"].href, width=400)
Out[403]:
No description has been provided for this image

The image is very low res, but it gives us a sense of what's to come. Notice that it's a lot bigger than our area of interest.

Item Assets ($t_1$)¶

Each item comes with several "assets", which broadly speaking are images at different wavelengths and resolutions.

In [430]:
print_assets(min_cloud_t1)
aot | Aerosol optical thickness (AOT)
blue | Blue - 10m
cloud | Cloud Probabilities
coastal | Coastal - 60m
granule_metadata | None
green | Green - 10m
nir | NIR 1 - 10m
nir08 | NIR 2 - 20m
nir09 | NIR 3 - 60m
product_metadata | None
red | Red - 10m
rededge1 | Red Edge 1 - 20m
rededge2 | Red Edge 2 - 20m
rededge3 | Red Edge 3 - 20m
scl | Scene classification map (SCL)
snow | Snow Probabilities
swir16 | SWIR 1.6μm - 20m
swir22 | SWIR 2.2μm - 20m
tileinfo_metadata | None
visual | True color image
wvp | Water Vapour (WVP)
thumbnail | Thumbnail of preview image
aot-jp2 | Aerosol optical thickness (AOT)
blue-jp2 | Blue - 10m
coastal-jp2 | Coastal - 60m
green-jp2 | Green - 10m
nir-jp2 | NIR 1 - 10m
nir08-jp2 | NIR 2 - 20m
nir09-jp2 | NIR 3 - 60m
red-jp2 | Red - 10m
rededge1-jp2 | Red Edge 1 - 20m
rededge2-jp2 | Red Edge 2 - 20m
rededge3-jp2 | Red Edge 3 - 20m
scl-jp2 | Scene classification map (SCL)
swir16-jp2 | SWIR 1.6μm - 20m
swir22-jp2 | SWIR 2.2μm - 20m
visual-jp2 | True color image
wvp-jp2 | Water Vapour (WVP)

Selecting Assets and Area ($t_1$)¶

Recall, that we are interested in four different indexes (NDVI, NDWI, IBI, NBR) as well as RGB imagery. To compile these, we select the following bands:

  • RGB (red, green, blue), i.e. "standard" photography
  • Two bands of short-wave infrared (SWIR16, SWIR22) and near infrared (NIR)

We can select them from the Sentinel-2 data with the following query words:

In [405]:
selected_bands = ["swir16", "swir22","nir","red","green","blue"]

All of these are available at either the 10m or 20m resolution!

Getting the appropriate polygon ($t_1$)¶

We are still only dealing with descriptions of our data, not the actual data.

Before we load the data, recall that the images of interestet were MUCH larger than our area of interest. So we want to filter and only load part of each image.

To do this, we find the intersection polygons between (1) each image of interest and (2) the total area of interest.

For our example image, the bounds of the image can be found like this, using the Python package shapely:

In [406]:
min_cloud_t1_poly = Polygon(*min_cloud_t1.geometry['coordinates'])
min_cloud_t1_poly
Out[406]:
No description has been provided for this image

For the bbox of our total AOI, like this:

In [407]:
bbox_poly = box(*bbox)
bbox_poly
Out[407]:
No description has been provided for this image

Now, we can use shapely to find their intersection.

In [408]:
intersection_poly = shapely.intersection(
    bbox_poly,
    min_cloud_t1_poly)

intersection_poly
Out[408]:
No description has been provided for this image

For our example image, this is the part of the image that we want to retrieve!

In [409]:
min_cloud_t1.geometry
Out[409]:
{'type': 'Polygon',
 'coordinates': [[[-119.17376896599782, 34.32235671057083],
   [-119.14885662021419, 33.33277630652224],
   [-117.96938626406873, 33.34758667242361],
   [-117.98063319821665, 34.33772750342932],
   [-119.17376896599782, 34.32235671057083]]]}
In [410]:
min_cloud_t1
Out[410]:
  • type "Feature"
  • stac_version "1.1.0"
  • stac_extensions[] 8 items
    • 0 "https://stac-extensions.github.io/grid/v1.1.0/schema.json"
    • 1 "https://stac-extensions.github.io/view/v1.0.0/schema.json"
    • 2 "https://stac-extensions.github.io/sentinel-2/v1.0.0/schema.json"
    • 3 "https://stac-extensions.github.io/projection/v2.0.0/schema.json"
    • 4 "https://stac-extensions.github.io/eo/v1.1.0/schema.json"
    • 5 "https://stac-extensions.github.io/raster/v1.1.0/schema.json"
    • 6 "https://stac-extensions.github.io/mgrs/v1.0.0/schema.json"
    • 7 "https://stac-extensions.github.io/processing/v1.1.0/schema.json"
  • id "S2C_11SLT_20250221_0_L2A"
  • geometry
    • type "Polygon"
    • coordinates[] 1 items
      • 0[] 5 items
        • 0[] 2 items
          • 0 -119.17376896599782
          • 1 34.32235671057083
        • 1[] 2 items
          • 0 -119.14885662021419
          • 1 33.33277630652224
        • 2[] 2 items
          • 0 -117.96938626406873
          • 1 33.34758667242361
        • 3[] 2 items
          • 0 -117.98063319821665
          • 1 34.33772750342932
        • 4[] 2 items
          • 0 -119.17376896599782
          • 1 34.32235671057083
  • bbox[] 4 items
    • 0 -119.173769
    • 1 33.332776
    • 2 -117.969386
    • 3 34.337728
  • properties
    • created "2025-02-22T01:53:43.505Z"
    • platform "sentinel-2c"
    • constellation "sentinel-2"
    • instruments[] 1 items
      • 0 "msi"
    • eo:cloud_cover 4.984134
    • proj:code "EPSG:32611"
    • proj:centroid
      • lat 33.83606
      • lon -118.56814
    • mgrs:utm_zone 11
    • mgrs:latitude_band "S"
    • mgrs:grid_square "LT"
    • grid:code "MGRS-11SLT"
    • view:azimuth 102.12176753134347
    • view:incidence_angle 4.749574361931863
    • view:sun_azimuth 152.371295355222
    • view:sun_elevation 41.754986507204
    • s2:tile_id "S2C_OPER_MSI_L2A_TL_2CPS_20250222T001111_A002428_T11SLT_N05.11"
    • s2:degraded_msi_data_percentage 0.0213
    • s2:nodata_pixel_percentage 0
    • s2:saturated_defective_pixel_percentage 0
    • s2:cloud_shadow_percentage 0.002472
    • s2:vegetation_percentage 8.055272
    • s2:not_vegetated_percentage 33.023557
    • s2:water_percentage 53.660136
    • s2:unclassified_percentage 0.036198
    • s2:medium_proba_clouds_percentage 1.612118
    • s2:high_proba_clouds_percentage 2.46034
    • s2:thin_cirrus_percentage 0.911676
    • s2:snow_ice_percentage 0.004967
    • s2:product_type "S2MSI2A"
    • s2:processing_baseline "05.11"
    • s2:product_uri "S2C_MSIL2A_20250221T183421_N0511_R027_T11SLT_20250222T001111.SAFE"
    • s2:generation_time "2025-02-22T00:11:11.000000Z"
    • s2:datatake_id "GS2C_20250221T183421_002428_N05.11"
    • s2:datatake_type "INS-NOBS"
    • s2:datastrip_id "S2C_OPER_MSI_L2A_DS_2CPS_20250222T001111_S20250221T183723_N05.11"
    • s2:reflectance_conversion_factor 1.02408600818865
    • datetime "2025-02-21T18:45:25.463000Z"
    • s2:sequence "0"
    • earthsearch:s3_path "s3://sentinel-cogs/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A"
    • earthsearch:payload_id "roda-sentinel2/workflow-sentinel2-to-stac/a6889564d8b608340f2dfb2ae9d8b496"
    • earthsearch:boa_offset_applied True
    • processing:software
      • sentinel2-to-stac "0.1.1"
    • updated "2025-02-22T01:53:43.505Z"
  • links[] 8 items
    • 0
      • rel "self"
      • href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l2a/items/S2C_11SLT_20250221_0_L2A"
      • type "application/geo+json"
    • 1
      • rel "canonical"
      • href "s3://sentinel-cogs/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/S2C_11SLT_20250221_0_L2A.json"
      • type "application/json"
    • 2
      • rel "license"
      • href "https://sentinel.esa.int/documents/247904/690755/Sentinel_Data_Legal_Notice"
    • 3
      • rel "derived_from"
      • href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l1c/items/S2C_11SLT_20250221_0_L1C"
      • type "application/geo+json"
    • 4
      • rel "parent"
      • href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l2a"
      • type "application/json"
    • 5
      • rel "collection"
      • href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l2a"
      • type "application/json"
    • 6
      • rel "root"
      • href "https://earth-search.aws.element84.com/v1"
      • type "application/json"
      • title "Earth Search by Element 84"
    • 7
      • rel "thumbnail"
      • href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l2a/items/S2C_11SLT_20250221_0_L2A/thumbnail"
  • assets
    • aot
      • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/AOT.tif"
      • type "image/tiff; application=geotiff; profile=cloud-optimized"
      • title "Aerosol optical thickness (AOT)"
      • gsd 20
      • proj:shape[] 2 items
        • 0 5490
        • 1 5490
      • proj:transform[] 6 items
        • 0 20
        • 1 0
        • 2 300000
        • 3 0
        • 4 -20
        • 5 3800040
      • raster:bands[] 1 items
        • 0
          • nodata 0
          • data_type "uint16"
          • spatial_resolution 20
          • scale 0.001
          • offset 0
      • roles[] 1 items
        • 0 "data"
    • blue
      • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B02.tif"
      • type "image/tiff; application=geotiff; profile=cloud-optimized"
      • title "Blue - 10m"
      • eo:bands[] 1 items
        • 0
          • name "B02"
          • common_name "blue"
          • center_wavelength 0.49
          • full_width_half_max 0.098
      • gsd 10
      • proj:shape[] 2 items
        • 0 10980
        • 1 10980
      • proj:transform[] 6 items
        • 0 10
        • 1 0
        • 2 300000
        • 3 0
        • 4 -10
        • 5 3800040
      • raster:bands[] 1 items
        • 0
          • nodata 0
          • data_type "uint16"
          • spatial_resolution 10
          • scale 0.0001
          • offset -0.1
      • roles[] 2 items
        • 0 "data"
        • 1 "reflectance"
    • cloud
      • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/qi/CLD_20m.jp2"
      • type "image/jp2"
      • title "Cloud Probabilities"
      • gsd 20
      • proj:shape[] 2 items
        • 0 5490
        • 1 5490
      • proj:transform[] 6 items
        • 0 20
        • 1 0
        • 2 300000
        • 3 0
        • 4 -20
        • 5 3800040
      • raster:bands[] 1 items
        • 0
          • nodata 0
          • data_type "uint8"
          • spatial_resolution 20
      • roles[] 2 items
        • 0 "data"
        • 1 "cloud"
    • coastal
      • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B01.tif"
      • type "image/tiff; application=geotiff; profile=cloud-optimized"
      • title "Coastal - 60m"
      • eo:bands[] 1 items
        • 0
          • name "B01"
          • common_name "coastal"
          • center_wavelength 0.443
          • full_width_half_max 0.027
      • gsd 60
      • proj:shape[] 2 items
        • 0 1830
        • 1 1830
      • proj:transform[] 6 items
        • 0 60
        • 1 0
        • 2 300000
        • 3 0
        • 4 -60
        • 5 3800040
      • raster:bands[] 1 items
        • 0
          • nodata 0
          • data_type "uint16"
          • spatial_resolution 60
          • scale 0.0001
          • offset -0.1
      • roles[] 2 items
        • 0 "data"
        • 1 "reflectance"
    • granule_metadata
      • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/granule_metadata.xml"
      • type "application/xml"
      • roles[] 1 items
        • 0 "metadata"
    • green
      • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B03.tif"
      • type "image/tiff; application=geotiff; profile=cloud-optimized"
      • title "Green - 10m"
      • eo:bands[] 1 items
        • 0
          • name "B03"
          • common_name "green"
          • center_wavelength 0.56
          • full_width_half_max 0.045
      • gsd 10
      • proj:shape[] 2 items
        • 0 10980
        • 1 10980
      • proj:transform[] 6 items
        • 0 10
        • 1 0
        • 2 300000
        • 3 0
        • 4 -10
        • 5 3800040
      • raster:bands[] 1 items
        • 0
          • nodata 0
          • data_type "uint16"
          • spatial_resolution 10
          • scale 0.0001
          • offset -0.1
      • roles[] 2 items
        • 0 "data"
        • 1 "reflectance"
    • nir
      • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B08.tif"
      • type "image/tiff; application=geotiff; profile=cloud-optimized"
      • title "NIR 1 - 10m"
      • eo:bands[] 1 items
        • 0
          • name "B08"
          • common_name "nir"
          • center_wavelength 0.842
          • full_width_half_max 0.145
      • gsd 10
      • proj:shape[] 2 items
        • 0 10980
        • 1 10980
      • proj:transform[] 6 items
        • 0 10
        • 1 0
        • 2 300000
        • 3 0
        • 4 -10
        • 5 3800040
      • raster:bands[] 1 items
        • 0
          • nodata 0
          • data_type "uint16"
          • spatial_resolution 10
          • scale 0.0001
          • offset -0.1
      • roles[] 2 items
        • 0 "data"
        • 1 "reflectance"
    • nir08
      • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B8A.tif"
      • type "image/tiff; application=geotiff; profile=cloud-optimized"
      • title "NIR 2 - 20m"
      • eo:bands[] 1 items
        • 0
          • name "B8A"
          • common_name "nir08"
          • center_wavelength 0.865
          • full_width_half_max 0.033
      • gsd 20
      • proj:shape[] 2 items
        • 0 5490
        • 1 5490
      • proj:transform[] 6 items
        • 0 20
        • 1 0
        • 2 300000
        • 3 0
        • 4 -20
        • 5 3800040
      • raster:bands[] 1 items
        • 0
          • nodata 0
          • data_type "uint16"
          • spatial_resolution 20
          • scale 0.0001
          • offset -0.1
      • roles[] 2 items
        • 0 "data"
        • 1 "reflectance"
    • nir09
      • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B09.tif"
      • type "image/tiff; application=geotiff; profile=cloud-optimized"
      • title "NIR 3 - 60m"
      • eo:bands[] 1 items
        • 0
          • name "B09"
          • common_name "nir09"
          • center_wavelength 0.945
          • full_width_half_max 0.026
      • gsd 60
      • proj:shape[] 2 items
        • 0 1830
        • 1 1830
      • proj:transform[] 6 items
        • 0 60
        • 1 0
        • 2 300000
        • 3 0
        • 4 -60
        • 5 3800040
      • raster:bands[] 1 items
        • 0
          • nodata 0
          • data_type "uint16"
          • spatial_resolution 60
          • scale 0.0001
          • offset -0.1
      • roles[] 2 items
        • 0 "data"
        • 1 "reflectance"
    • product_metadata
      • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/product_metadata.xml"
      • type "application/xml"
      • roles[] 1 items
        • 0 "metadata"
    • red
      • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B04.tif"
      • type "image/tiff; application=geotiff; profile=cloud-optimized"
      • title "Red - 10m"
      • eo:bands[] 1 items
        • 0
          • name "B04"
          • common_name "red"
          • center_wavelength 0.665
          • full_width_half_max 0.038
      • gsd 10
      • proj:shape[] 2 items
        • 0 10980
        • 1 10980
      • proj:transform[] 6 items
        • 0 10
        • 1 0
        • 2 300000
        • 3 0
        • 4 -10
        • 5 3800040
      • raster:bands[] 1 items
        • 0
          • nodata 0
          • data_type "uint16"
          • spatial_resolution 10
          • scale 0.0001
          • offset -0.1
      • roles[] 2 items
        • 0 "data"
        • 1 "reflectance"
    • rededge1
      • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B05.tif"
      • type "image/tiff; application=geotiff; profile=cloud-optimized"
      • title "Red Edge 1 - 20m"
      • eo:bands[] 1 items
        • 0
          • name "B05"
          • common_name "rededge"
          • center_wavelength 0.704
          • full_width_half_max 0.019
      • gsd 20
      • proj:shape[] 2 items
        • 0 5490
        • 1 5490
      • proj:transform[] 6 items
        • 0 20
        • 1 0
        • 2 300000
        • 3 0
        • 4 -20
        • 5 3800040
      • raster:bands[] 1 items
        • 0
          • nodata 0
          • data_type "uint16"
          • spatial_resolution 20
          • scale 0.0001
          • offset -0.1
      • roles[] 2 items
        • 0 "data"
        • 1 "reflectance"
    • rededge2
      • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B06.tif"
      • type "image/tiff; application=geotiff; profile=cloud-optimized"
      • title "Red Edge 2 - 20m"
      • eo:bands[] 1 items
        • 0
          • name "B06"
          • common_name "rededge"
          • center_wavelength 0.74
          • full_width_half_max 0.018
      • gsd 20
      • proj:shape[] 2 items
        • 0 5490
        • 1 5490
      • proj:transform[] 6 items
        • 0 20
        • 1 0
        • 2 300000
        • 3 0
        • 4 -20
        • 5 3800040
      • raster:bands[] 1 items
        • 0
          • nodata 0
          • data_type "uint16"
          • spatial_resolution 20
          • scale 0.0001
          • offset -0.1
      • roles[] 2 items
        • 0 "data"
        • 1 "reflectance"
    • rededge3
      • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B07.tif"
      • type "image/tiff; application=geotiff; profile=cloud-optimized"
      • title "Red Edge 3 - 20m"
      • eo:bands[] 1 items
        • 0
          • name "B07"
          • common_name "rededge"
          • center_wavelength 0.783
          • full_width_half_max 0.028
      • gsd 20
      • proj:shape[] 2 items
        • 0 5490
        • 1 5490
      • proj:transform[] 6 items
        • 0 20
        • 1 0
        • 2 300000
        • 3 0
        • 4 -20
        • 5 3800040
      • raster:bands[] 1 items
        • 0
          • nodata 0
          • data_type "uint16"
          • spatial_resolution 20
          • scale 0.0001
          • offset -0.1
      • roles[] 2 items
        • 0 "data"
        • 1 "reflectance"
    • scl
      • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/SCL.tif"
      • type "image/tiff; application=geotiff; profile=cloud-optimized"
      • title "Scene classification map (SCL)"
      • gsd 20
      • proj:shape[] 2 items
        • 0 5490
        • 1 5490
      • proj:transform[] 6 items
        • 0 20
        • 1 0
        • 2 300000
        • 3 0
        • 4 -20
        • 5 3800040
      • raster:bands[] 1 items
        • 0
          • nodata 0
          • data_type "uint8"
          • spatial_resolution 20
      • roles[] 1 items
        • 0 "data"
    • snow
      • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/qi/SNW_20m.jp2"
      • type "image/jp2"
      • title "Snow Probabilities"
      • proj:shape[] 2 items
        • 0 5490
        • 1 5490
      • proj:transform[] 6 items
        • 0 20
        • 1 0
        • 2 300000
        • 3 0
        • 4 -20
        • 5 3800040
      • raster:bands[] 1 items
        • 0
          • nodata 0
          • data_type "uint8"
          • spatial_resolution 20
      • roles[] 2 items
        • 0 "data"
        • 1 "snow-ice"
    • swir16
      • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B11.tif"
      • type "image/tiff; application=geotiff; profile=cloud-optimized"
      • title "SWIR 1.6μm - 20m"
      • eo:bands[] 1 items
        • 0
          • name "B11"
          • common_name "swir16"
          • center_wavelength 1.61
          • full_width_half_max 0.143
      • gsd 20
      • proj:shape[] 2 items
        • 0 5490
        • 1 5490
      • proj:transform[] 6 items
        • 0 20
        • 1 0
        • 2 300000
        • 3 0
        • 4 -20
        • 5 3800040
      • raster:bands[] 1 items
        • 0
          • nodata 0
          • data_type "uint16"
          • spatial_resolution 20
          • scale 0.0001
          • offset -0.1
      • roles[] 2 items
        • 0 "data"
        • 1 "reflectance"
    • swir22
      • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B12.tif"
      • type "image/tiff; application=geotiff; profile=cloud-optimized"
      • title "SWIR 2.2μm - 20m"
      • eo:bands[] 1 items
        • 0
          • name "B12"
          • common_name "swir22"
          • center_wavelength 2.19
          • full_width_half_max 0.242
      • gsd 20
      • proj:shape[] 2 items
        • 0 5490
        • 1 5490
      • proj:transform[] 6 items
        • 0 20
        • 1 0
        • 2 300000
        • 3 0
        • 4 -20
        • 5 3800040
      • raster:bands[] 1 items
        • 0
          • nodata 0
          • data_type "uint16"
          • spatial_resolution 20
          • scale 0.0001
          • offset -0.1
      • roles[] 2 items
        • 0 "data"
        • 1 "reflectance"
    • tileinfo_metadata
      • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/tileinfo_metadata.json"
      • type "application/json"
      • roles[] 1 items
        • 0 "metadata"
    • visual
      • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/TCI.tif"
      • type "image/tiff; application=geotiff; profile=cloud-optimized"
      • title "True color image"
      • eo:bands[] 3 items
        • 0
          • name "B04"
          • common_name "red"
          • center_wavelength 0.665
          • full_width_half_max 0.038
        • 1
          • name "B03"
          • common_name "green"
          • center_wavelength 0.56
          • full_width_half_max 0.045
        • 2
          • name "B02"
          • common_name "blue"
          • center_wavelength 0.49
          • full_width_half_max 0.098
      • raster:bands[] 3 items
        • 0
          • nodata 0
          • data_type "uint8"
          • spatial_resolution 10
        • 1
          • nodata 0
          • data_type "uint8"
          • spatial_resolution 10
        • 2
          • nodata 0
          • data_type "uint8"
          • spatial_resolution 10
      • gsd 10
      • proj:shape[] 2 items
        • 0 10980
        • 1 10980
      • proj:transform[] 6 items
        • 0 10
        • 1 0
        • 2 300000
        • 3 0
        • 4 -10
        • 5 3800040
      • roles[] 1 items
        • 0 "visual"
    • wvp
      • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/WVP.tif"
      • type "image/tiff; application=geotiff; profile=cloud-optimized"
      • title "Water Vapour (WVP)"
      • gsd 20
      • proj:shape[] 2 items
        • 0 5490
        • 1 5490
      • proj:transform[] 6 items
        • 0 20
        • 1 0
        • 2 300000
        • 3 0
        • 4 -20
        • 5 3800040
      • raster:bands[] 1 items
        • 0
          • nodata 0
          • data_type "uint16"
          • spatial_resolution 20
          • unit "cm"
          • scale 0.001
          • offset 0
      • roles[] 1 items
        • 0 "data"
    • thumbnail
      • href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/preview.jpg"
      • type "image/jpeg"
      • title "Thumbnail of preview image"
      • roles[] 1 items
        • 0 "thumbnail"
    • aot-jp2
      • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/AOT.jp2"
      • type "image/jp2"
      • title "Aerosol optical thickness (AOT)"
      • gsd 20
      • proj:shape[] 2 items
        • 0 5490
        • 1 5490
      • proj:transform[] 6 items
        • 0 20
        • 1 0
        • 2 300000
        • 3 0
        • 4 -20
        • 5 3800040
      • raster:bands[] 1 items
        • 0
          • nodata 0
          • data_type "uint16"
          • spatial_resolution 20
          • scale 0.001
          • offset 0
      • roles[] 1 items
        • 0 "data"
    • blue-jp2
      • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R10m/B02.jp2"
      • type "image/jp2"
      • title "Blue - 10m"
      • eo:bands[] 1 items
        • 0
          • name "B02"
          • common_name "blue"
          • center_wavelength 0.49
          • full_width_half_max 0.098
      • gsd 10
      • proj:shape[] 2 items
        • 0 10980
        • 1 10980
      • proj:transform[] 6 items
        • 0 10
        • 1 0
        • 2 300000
        • 3 0
        • 4 -10
        • 5 3800040
      • raster:bands[] 1 items
        • 0
          • nodata 0
          • data_type "uint16"
          • spatial_resolution 10
          • scale 0.0001
          • offset -0.1
      • roles[] 2 items
        • 0 "data"
        • 1 "reflectance"
    • coastal-jp2
      • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R60m/B01.jp2"
      • type "image/jp2"
      • title "Coastal - 60m"
      • eo:bands[] 1 items
        • 0
          • name "B01"
          • common_name "coastal"
          • center_wavelength 0.443
          • full_width_half_max 0.027
      • gsd 60
      • proj:shape[] 2 items
        • 0 1830
        • 1 1830
      • proj:transform[] 6 items
        • 0 60
        • 1 0
        • 2 300000
        • 3 0
        • 4 -60
        • 5 3800040
      • raster:bands[] 1 items
        • 0
          • nodata 0
          • data_type "uint16"
          • spatial_resolution 60
          • scale 0.0001
          • offset -0.1
      • roles[] 2 items
        • 0 "data"
        • 1 "reflectance"
    • green-jp2
      • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R10m/B03.jp2"
      • type "image/jp2"
      • title "Green - 10m"
      • eo:bands[] 1 items
        • 0
          • name "B03"
          • common_name "green"
          • center_wavelength 0.56
          • full_width_half_max 0.045
      • gsd 10
      • proj:shape[] 2 items
        • 0 10980
        • 1 10980
      • proj:transform[] 6 items
        • 0 10
        • 1 0
        • 2 300000
        • 3 0
        • 4 -10
        • 5 3800040
      • raster:bands[] 1 items
        • 0
          • nodata 0
          • data_type "uint16"
          • spatial_resolution 10
          • scale 0.0001
          • offset -0.1
      • roles[] 2 items
        • 0 "data"
        • 1 "reflectance"
    • nir-jp2
      • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R10m/B08.jp2"
      • type "image/jp2"
      • title "NIR 1 - 10m"
      • eo:bands[] 1 items
        • 0
          • name "B08"
          • common_name "nir"
          • center_wavelength 0.842
          • full_width_half_max 0.145
      • gsd 10
      • proj:shape[] 2 items
        • 0 10980
        • 1 10980
      • proj:transform[] 6 items
        • 0 10
        • 1 0
        • 2 300000
        • 3 0
        • 4 -10
        • 5 3800040
      • raster:bands[] 1 items
        • 0
          • nodata 0
          • data_type "uint16"
          • spatial_resolution 10
          • scale 0.0001
          • offset -0.1
      • roles[] 2 items
        • 0 "data"
        • 1 "reflectance"
    • nir08-jp2
      • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/B8A.jp2"
      • type "image/jp2"
      • title "NIR 2 - 20m"
      • eo:bands[] 1 items
        • 0
          • name "B8A"
          • common_name "nir08"
          • center_wavelength 0.865
          • full_width_half_max 0.033
      • gsd 20
      • proj:shape[] 2 items
        • 0 5490
        • 1 5490
      • proj:transform[] 6 items
        • 0 20
        • 1 0
        • 2 300000
        • 3 0
        • 4 -20
        • 5 3800040
      • raster:bands[] 1 items
        • 0
          • nodata 0
          • data_type "uint16"
          • spatial_resolution 20
          • scale 0.0001
          • offset -0.1
      • roles[] 2 items
        • 0 "data"
        • 1 "reflectance"
    • nir09-jp2
      • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R60m/B09.jp2"
      • type "image/jp2"
      • title "NIR 3 - 60m"
      • eo:bands[] 1 items
        • 0
          • name "B09"
          • common_name "nir09"
          • center_wavelength 0.945
          • full_width_half_max 0.026
      • gsd 60
      • proj:shape[] 2 items
        • 0 1830
        • 1 1830
      • proj:transform[] 6 items
        • 0 60
        • 1 0
        • 2 300000
        • 3 0
        • 4 -60
        • 5 3800040
      • raster:bands[] 1 items
        • 0
          • nodata 0
          • data_type "uint16"
          • spatial_resolution 60
          • scale 0.0001
          • offset -0.1
      • roles[] 2 items
        • 0 "data"
        • 1 "reflectance"
    • red-jp2
      • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R10m/B04.jp2"
      • type "image/jp2"
      • title "Red - 10m"
      • eo:bands[] 1 items
        • 0
          • name "B04"
          • common_name "red"
          • center_wavelength 0.665
          • full_width_half_max 0.038
      • gsd 10
      • proj:shape[] 2 items
        • 0 10980
        • 1 10980
      • proj:transform[] 6 items
        • 0 10
        • 1 0
        • 2 300000
        • 3 0
        • 4 -10
        • 5 3800040
      • raster:bands[] 1 items
        • 0
          • nodata 0
          • data_type "uint16"
          • spatial_resolution 10
          • scale 0.0001
          • offset -0.1
      • roles[] 2 items
        • 0 "data"
        • 1 "reflectance"
    • rededge1-jp2
      • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/B05.jp2"
      • type "image/jp2"
      • title "Red Edge 1 - 20m"
      • eo:bands[] 1 items
        • 0
          • name "B05"
          • common_name "rededge"
          • center_wavelength 0.704
          • full_width_half_max 0.019
      • gsd 20
      • proj:shape[] 2 items
        • 0 5490
        • 1 5490
      • proj:transform[] 6 items
        • 0 20
        • 1 0
        • 2 300000
        • 3 0
        • 4 -20
        • 5 3800040
      • raster:bands[] 1 items
        • 0
          • nodata 0
          • data_type "uint16"
          • spatial_resolution 20
          • scale 0.0001
          • offset -0.1
      • roles[] 2 items
        • 0 "data"
        • 1 "reflectance"
    • rededge2-jp2
      • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/B06.jp2"
      • type "image/jp2"
      • title "Red Edge 2 - 20m"
      • eo:bands[] 1 items
        • 0
          • name "B06"
          • common_name "rededge"
          • center_wavelength 0.74
          • full_width_half_max 0.018
      • gsd 20
      • proj:shape[] 2 items
        • 0 5490
        • 1 5490
      • proj:transform[] 6 items
        • 0 20
        • 1 0
        • 2 300000
        • 3 0
        • 4 -20
        • 5 3800040
      • raster:bands[] 1 items
        • 0
          • nodata 0
          • data_type "uint16"
          • spatial_resolution 20
          • scale 0.0001
          • offset -0.1
      • roles[] 2 items
        • 0 "data"
        • 1 "reflectance"
    • rededge3-jp2
      • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/B07.jp2"
      • type "image/jp2"
      • title "Red Edge 3 - 20m"
      • eo:bands[] 1 items
        • 0
          • name "B07"
          • common_name "rededge"
          • center_wavelength 0.783
          • full_width_half_max 0.028
      • gsd 20
      • proj:shape[] 2 items
        • 0 5490
        • 1 5490
      • proj:transform[] 6 items
        • 0 20
        • 1 0
        • 2 300000
        • 3 0
        • 4 -20
        • 5 3800040
      • raster:bands[] 1 items
        • 0
          • nodata 0
          • data_type "uint16"
          • spatial_resolution 20
          • scale 0.0001
          • offset -0.1
      • roles[] 2 items
        • 0 "data"
        • 1 "reflectance"
    • scl-jp2
      • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/SCL.jp2"
      • type "image/jp2"
      • title "Scene classification map (SCL)"
      • gsd 20
      • proj:shape[] 2 items
        • 0 5490
        • 1 5490
      • proj:transform[] 6 items
        • 0 20
        • 1 0
        • 2 300000
        • 3 0
        • 4 -20
        • 5 3800040
      • raster:bands[] 1 items
        • 0
          • nodata 0
          • data_type "uint8"
          • spatial_resolution 20
      • roles[] 1 items
        • 0 "data"
    • swir16-jp2
      • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/B11.jp2"
      • type "image/jp2"
      • title "SWIR 1.6μm - 20m"
      • eo:bands[] 1 items
        • 0
          • name "B11"
          • common_name "swir16"
          • center_wavelength 1.61
          • full_width_half_max 0.143
      • gsd 20
      • proj:shape[] 2 items
        • 0 5490
        • 1 5490
      • proj:transform[] 6 items
        • 0 20
        • 1 0
        • 2 300000
        • 3 0
        • 4 -20
        • 5 3800040
      • raster:bands[] 1 items
        • 0
          • nodata 0
          • data_type "uint16"
          • spatial_resolution 20
          • scale 0.0001
          • offset -0.1
      • roles[] 2 items
        • 0 "data"
        • 1 "reflectance"
    • swir22-jp2
      • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/B12.jp2"
      • type "image/jp2"
      • title "SWIR 2.2μm - 20m"
      • eo:bands[] 1 items
        • 0
          • name "B12"
          • common_name "swir22"
          • center_wavelength 2.19
          • full_width_half_max 0.242
      • gsd 20
      • proj:shape[] 2 items
        • 0 5490
        • 1 5490
      • proj:transform[] 6 items
        • 0 20
        • 1 0
        • 2 300000
        • 3 0
        • 4 -20
        • 5 3800040
      • raster:bands[] 1 items
        • 0
          • nodata 0
          • data_type "uint16"
          • spatial_resolution 20
          • scale 0.0001
          • offset -0.1
      • roles[] 2 items
        • 0 "data"
        • 1 "reflectance"
    • visual-jp2
      • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R10m/TCI.jp2"
      • type "image/jp2"
      • title "True color image"
      • eo:bands[] 3 items
        • 0
          • name "B04"
          • common_name "red"
          • center_wavelength 0.665
          • full_width_half_max 0.038
        • 1
          • name "B03"
          • common_name "green"
          • center_wavelength 0.56
          • full_width_half_max 0.045
        • 2
          • name "B02"
          • common_name "blue"
          • center_wavelength 0.49
          • full_width_half_max 0.098
      • raster:bands[] 3 items
        • 0
          • nodata 0
          • data_type "uint8"
          • spatial_resolution 10
        • 1
          • nodata 0
          • data_type "uint8"
          • spatial_resolution 10
        • 2
          • nodata 0
          • data_type "uint8"
          • spatial_resolution 10
      • gsd 10
      • proj:shape[] 2 items
        • 0 10980
        • 1 10980
      • proj:transform[] 6 items
        • 0 10
        • 1 0
        • 2 300000
        • 3 0
        • 4 -10
        • 5 3800040
      • roles[] 1 items
        • 0 "visual"
    • wvp-jp2
      • href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/WVP.jp2"
      • type "image/jp2"
      • title "Water Vapour (WVP)"
      • gsd 20
      • proj:shape[] 2 items
        • 0 5490
        • 1 5490
      • proj:transform[] 6 items
        • 0 20
        • 1 0
        • 2 300000
        • 3 0
        • 4 -20
        • 5 3800040
      • raster:bands[] 1 items
        • 0
          • nodata 0
          • data_type "uint16"
          • spatial_resolution 20
          • unit "cm"
          • scale 0.001
          • offset 0
      • roles[] 1 items
        • 0 "data"
  • collection "sentinel-2-l2a"

Load the Item into Memory ($t_1$)¶

To reiterate.

To actually get the data and not just a description of it, we need to "load" it.

  • We only pick the relevant bands
  • We limit the image to the intersection polygon
  • We lower the resolution

Now we can actually retrieve our example image using the stac_load function from the helper library odc.stac. This returns an xarray dataset.

In [411]:
data_t1 = stac_load([min_cloud_t1], 
                    bands = selected_bands,
                    bbox=intersection_poly.bounds,
                    crs="EPSG:32611",
                    chunks={},
                    #resolution=0.5, #could be as low as 0.00009009
                    progress=tqdm).isel(time=0)

data_t1
Out[411]:
<xarray.Dataset> Size: 6MB
Dimensions:      (y: 489, x: 959)
Coordinates:
  * y            (y) float64 4kB 3.771e+06 3.771e+06 ... 3.766e+06 3.766e+06
  * x            (x) float64 8kB 3.521e+05 3.522e+05 ... 3.617e+05 3.617e+05
    spatial_ref  int32 4B 32611
    time         datetime64[ns] 8B 2025-02-21T18:45:25.463000
Data variables:
    swir16       (y, x) uint16 938kB dask.array<chunksize=(489, 959), meta=np.ndarray>
    swir22       (y, x) uint16 938kB dask.array<chunksize=(489, 959), meta=np.ndarray>
    nir          (y, x) uint16 938kB dask.array<chunksize=(489, 959), meta=np.ndarray>
    red          (y, x) uint16 938kB dask.array<chunksize=(489, 959), meta=np.ndarray>
    green        (y, x) uint16 938kB dask.array<chunksize=(489, 959), meta=np.ndarray>
    blue         (y, x) uint16 938kB dask.array<chunksize=(489, 959), meta=np.ndarray>
xarray.Dataset
    • y: 489
    • x: 959
    • y
      (y)
      float64
      3.771e+06 3.771e+06 ... 3.766e+06
      units :
      metre
      resolution :
      -10.0
      crs :
      EPSG:32611
      array([3771225., 3771215., 3771205., ..., 3766365., 3766355., 3766345.])
    • x
      (x)
      float64
      3.521e+05 3.522e+05 ... 3.617e+05
      units :
      metre
      resolution :
      10.0
      crs :
      EPSG:32611
      array([352145., 352155., 352165., ..., 361705., 361715., 361725.])
    • spatial_ref
      ()
      int32
      32611
      spatial_ref :
      PROJCRS["WGS 84 / UTM zone 11N",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 11N",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-117,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 120°W and 114°W, northern hemisphere between equator and 84°N, onshore and offshore. Canada - Alberta; British Columbia (BC); Northwest Territories (NWT); Nunavut. Mexico. United States (USA)."],BBOX[0,-120,84,-114]],ID["EPSG",32611]]
      crs_wkt :
      PROJCRS["WGS 84 / UTM zone 11N",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 11N",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-117,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 120°W and 114°W, northern hemisphere between equator and 84°N, onshore and offshore. Canada - Alberta; British Columbia (BC); Northwest Territories (NWT); Nunavut. Mexico. United States (USA)."],BBOX[0,-120,84,-114]],ID["EPSG",32611]]
      semi_major_axis :
      6378137.0
      semi_minor_axis :
      6356752.314245179
      inverse_flattening :
      298.257223563
      reference_ellipsoid_name :
      WGS 84
      longitude_of_prime_meridian :
      0.0
      prime_meridian_name :
      Greenwich
      geographic_crs_name :
      WGS 84
      horizontal_datum_name :
      World Geodetic System 1984 ensemble
      projected_crs_name :
      WGS 84 / UTM zone 11N
      grid_mapping_name :
      transverse_mercator
      latitude_of_projection_origin :
      0.0
      longitude_of_central_meridian :
      -117.0
      false_easting :
      500000.0
      false_northing :
      0.0
      scale_factor_at_central_meridian :
      0.9996
      GeoTransform :
      352140 10 0 3771230 0 -10
      array(32611, dtype=int32)
    • time
      ()
      datetime64[ns]
      2025-02-21T18:45:25.463000
      array('2025-02-21T18:45:25.463000000', dtype='datetime64[ns]')
    • swir16
      (y, x)
      uint16
      dask.array<chunksize=(489, 959), meta=np.ndarray>
      nodata :
      0
      Array Chunk
      Bytes 915.92 kiB 915.92 kiB
      Shape (489, 959) (489, 959)
      Dask graph 1 chunks in 4 graph layers
      Data type uint16 numpy.ndarray
      959 489
    • swir22
      (y, x)
      uint16
      dask.array<chunksize=(489, 959), meta=np.ndarray>
      nodata :
      0
      Array Chunk
      Bytes 915.92 kiB 915.92 kiB
      Shape (489, 959) (489, 959)
      Dask graph 1 chunks in 4 graph layers
      Data type uint16 numpy.ndarray
      959 489
    • nir
      (y, x)
      uint16
      dask.array<chunksize=(489, 959), meta=np.ndarray>
      nodata :
      0
      Array Chunk
      Bytes 915.92 kiB 915.92 kiB
      Shape (489, 959) (489, 959)
      Dask graph 1 chunks in 4 graph layers
      Data type uint16 numpy.ndarray
      959 489
    • red
      (y, x)
      uint16
      dask.array<chunksize=(489, 959), meta=np.ndarray>
      nodata :
      0
      Array Chunk
      Bytes 915.92 kiB 915.92 kiB
      Shape (489, 959) (489, 959)
      Dask graph 1 chunks in 4 graph layers
      Data type uint16 numpy.ndarray
      959 489
    • green
      (y, x)
      uint16
      dask.array<chunksize=(489, 959), meta=np.ndarray>
      nodata :
      0
      Array Chunk
      Bytes 915.92 kiB 915.92 kiB
      Shape (489, 959) (489, 959)
      Dask graph 1 chunks in 4 graph layers
      Data type uint16 numpy.ndarray
      959 489
    • blue
      (y, x)
      uint16
      dask.array<chunksize=(489, 959), meta=np.ndarray>
      nodata :
      0
      Array Chunk
      Bytes 915.92 kiB 915.92 kiB
      Shape (489, 959) (489, 959)
      Dask graph 1 chunks in 4 graph layers
      Data type uint16 numpy.ndarray
      959 489
    • y
      PandasIndex
      PandasIndex(Index([3771225.0, 3771215.0, 3771205.0, 3771195.0, 3771185.0, 3771175.0,
             3771165.0, 3771155.0, 3771145.0, 3771135.0,
             ...
             3766435.0, 3766425.0, 3766415.0, 3766405.0, 3766395.0, 3766385.0,
             3766375.0, 3766365.0, 3766355.0, 3766345.0],
            dtype='float64', name='y', length=489))
    • x
      PandasIndex
      PandasIndex(Index([352145.0, 352155.0, 352165.0, 352175.0, 352185.0, 352195.0, 352205.0,
             352215.0, 352225.0, 352235.0,
             ...
             361635.0, 361645.0, 361655.0, 361665.0, 361675.0, 361685.0, 361695.0,
             361705.0, 361715.0, 361725.0],
            dtype='float64', name='x', length=959))

RGB visualization ($t_1$)¶

Normally, RGB data is expressed on the 0 to 255 or 0 to 1 range. That's no the case with Sentinel-2 data, so we normalize it into the 0, 255 range.

In [412]:
normalized_rgb_t1 = normalize_to_rgb(data_t1)
normalized_rgb_t1.shape
Out[412]:
(489, 959, 3)

Now we can get a regular RGB image of the intersection polygon we are interested in.

In [413]:
fig, ax = plt.subplots(figsize=(15, 15))

cax = ax.imshow(normalized_rgb_t1)
ax.set_title("The Pacific Palisades in LA after the January 2025 Fires", size=18)
Out[413]:
Text(0.5, 1.0, 'The Pacific Palisades in LA after the January 2025 Fires')
No description has been provided for this image

We can see that the hills are burned brown, in stark contrast to the green landscape in the lower-right corner.

Calculating Spectral Indices ($t_1$)¶

While we an see the burned area because we know it's there, we could use spectral indexes to discover it. For instance, recall that the formula for NDVI is:

$NDVI = \frac{(nir - red)}{(nir + red)}$

In code, this can be written as

In [414]:
def return_ndvi(data:xr.Dataset) -> xr.DataArray:
    """
    Calculate and return NDVI.
    """

    # Turn red band into floats
    red = data["red"].astype("float") 

    # Turn near infrared band into floats
    nir = data["nir"].astype("float")

    # Calculate NDVI
    ndvi = (nir - red) / (nir + red) 
    return ndvi
In [415]:
# Compute NDVI (Normalized Difference Vegetation Index)
ndvi_t1 = return_ndvi(data_t1)

I have written helper functions to calculate the two other indexes we need today.

In [416]:
from spectral_indexes import *

ndwi_t1 = return_ndwi(data_t1)
ibi_t1 = return_ibi(data_t1)

Visualizing Spectral Indices ($t_1$)¶

Using matplotlib, we can plot the NDVI values for T1 like so. What's that huge white blob? It's water. Let's remove it.

In [417]:
plot_single_image_spectral_idx(ndvi_t1, 30, 10, name = "NDVI")
No description has been provided for this image

NDWI helps us here.

In [418]:
plot_single_image_spectral_idx(ndwi_t1, 30, 10, name = "NDWI", cmap="Purples")
No description has been provided for this image

Using the NDWI, we can filter the water away from our building and vegetation indexes.

In [419]:
water_mask_t1 = ndwi_t1 > 0.1

ndvi_water_masked = np.where(water_mask_t1, np.nan, ndvi_t1)
ibi_water_masked = np.where(water_mask_t1, np.nan, ibi_t1)

Now, we get the following NDVI image. What do you notice?

In [420]:
plot_single_image_spectral_idx(ndvi_water_masked, 30, 10, name = "NDVI")
No description has been provided for this image

To find the buildings, we can plot the IBI after water masking. Notice how the Palisades have a much lower IBI than the neighboring area.

In [421]:
plot_single_image_spectral_idx(ibi_water_masked, 30, 10, name = "IBI", cmap="Purples")
No description has been provided for this image

Spectral index median values ($t_1$)¶

While we have explored the use of one image, it's better praxis to average values over several images. Here, we are interested in the month that has passed since the fire, i.e. all the $t_1$ items.

In [423]:
item_list_t1 = list(item_collection_t1)
item_list_t1
Out[423]:
[<Item id=S2C_11SLT_20250221_0_L2A>, <Item id=S2C_11SLT_20250201_0_L2A>]

We can calculate the NDVI and IBI for all of these. Let's also calculate the NBR to see the burned areas. First, we loop over all the items and calculate each index...

In [46]:
ndvis_t1 = calculate_spectral_index_over_items(item_list_t1, selected_bands, bbox, return_ndvi)
ibis_t1 = calculate_spectral_index_over_items(item_list_t1, selected_bands, bbox, return_ibi)
nbrs_t1 = calculate_spectral_index_over_items(item_list_t1, selected_bands, bbox, return_nbr)
Processing item 1 out of 1
100%|████████████████████████████████████████████████████████████████████████████| 6/6 [01:13<00:00, 12.32s/it]
Processing item 1 out of 1
100%|████████████████████████████████████████████████████████████████████████████| 6/6 [01:07<00:00, 11.19s/it]
Processing item 1 out of 1
100%|████████████████████████████████████████████████████████████████████████████| 6/6 [01:16<00:00, 12.71s/it]
Processing item 1 out of 1
100%|████████████████████████████████████████████████████████████████████████████| 6/6 [01:15<00:00, 12.52s/it]

... then we calculate the median.

In [47]:
%time median_ndvi_t1 = calculate_median_index(ndvis_t1)
%time median_ibi_t1 = calculate_median_index(ibis_t1)
%time median_nbr_t1 = calculate_median_index(nbrs_t1)
Concatenating Spectral Index images.
Calculating the means, this will take a while.
CPU times: user 19 ms, sys: 4.45 ms, total: 23.4 ms
Wall time: 22.7 ms
Concatenating Spectral Index images.
Calculating the means, this will take a while.
CPU times: user 16 ms, sys: 1.49 ms, total: 17.5 ms
Wall time: 17.5 ms
Concatenating Spectral Index images.
Calculating the means, this will take a while.
CPU times: user 15.2 ms, sys: 2.11 ms, total: 17.4 ms
Wall time: 17.4 ms
Concatenating Spectral Index images.
Calculating the means, this will take a while.
CPU times: user 17.4 ms, sys: 3.02 ms, total: 20.5 ms
Wall time: 20.5 ms

Behind the scenes, we have been using xarray. However, at this point we transition into numpy. We can use a very simple dummy function for this. However, we need to flip the data using np.flipud() in order to get it right in numpy.

In [493]:
def xr_spectral_index_data_to_np(xr_data:xr.DataArray) -> np.ndarray:
    """
    Turn xr.DataArray to np.ndarray and flip the results to make map face south to north.
    """
    return np.flipud(xr_data.to_numpy())
In [494]:
median_ndvi_t1_np = xr_spectral_index_data_to_np(median_ndvi_t1)
median_ibi_t1_np = xr_spectral_index_data_to_np(median_ibi_t1)
median_nbr_t1_np = xr_spectral_index_data_to_np(median_nbr_t1)

Plot Spectral Medians ($t_1$)¶

Let's plot the result, starting with the median NDVI.

In [426]:
median_ndvi_t1_np_water_masked = np.where(np.flipud(water_mask_t1), np.nan, median_ndvi_t1_np)
plot_territory(median_ndvi_t1_np_water_masked, 30, 10, 'Greens', 'Median NDVI T1')
No description has been provided for this image

Next, the IBI.

In [427]:
median_ibi_t1_np_water_masked = np.where(np.flipud(water_mask_t1), np.nan, median_ibi_t1_np)
plot_territory(median_ibi_t1_np_water_masked, 30, 10, 'Purples', 'Median IBI T1')
No description has been provided for this image

Finally, we get to the NBR. Notice how stark the contrast is between the affected areas and the neighboring area that was spared from the fire.

In [428]:
median_nbr_t1_np_water_masked = np.where(np.flipud(water_mask_t1), np.nan, median_nbr_t1_np)
plot_territory(median_nbr_t1_np_water_masked, 30, 10, 'Reds_r', 'Median NBR T1')
No description has been provided for this image

Part 2: Hands-on¶

Spectral Index change detection ($t_1$ - $t_0$)¶

Having calculated our indexes for $t_1$, we now have a starting point for seeing the impact of the Palisades Fire. For this purpose, we will re-calculate the indexes, but this time for a $t_0$ prior to the fire. Then, we will subtract these $t_0$ values from our $t_1$ values.

Choosing your $t_0$¶

In [53]:
dates_t0 = "2024-12-01/2025-01-06"

Prompt: How would you search for data from this period?

In [57]:
%%time
item_search_t0 = sentinel_client.search(
    collections=[collection], 
    datetime=dates_t0,
    bbox=bbox,
    query=["s2:nodata_pixel_percentage<20",
           "s2:degraded_msi_data_percentage<20",
           "eo:cloud_cover<20"],
    max_items = 5)
CPU times: user 382 µs, sys: 10 µs, total: 392 µs
Wall time: 395 µs
In [58]:
print_item_search_attributes(item_search_t0)
2 items found:

ID: S2A_11SLT_20250102_0_L2A 
 Cloud cover (%): 3.015763 
 Missing pixels (%): 7e-06 
 Missing band data (%): 0 
 Image area (km^2): 1.17 

ID: S2B_11SLT_20241218_0_L2A 
 Cloud cover (%): 0.004997 
 Missing pixels (%): 0 
 Missing band data (%): 0.0213 
 Image area (km^2): 1.17 

In [59]:
item_collection_t0 = item_search_t0.item_collection()
In [60]:
items_t0 = list(item_collection_t0)
items_t0[0].properties['datetime']
Out[60]:
'2025-01-02T18:45:02.738000Z'

Detour: Fixing Item Properties ($t_0$)¶

Before we dive deeper into the data, we need to take a brief detour. While preparing this tutorial, I noticed that newer Sentinel-2 data threw an error with older versions of pystac while older Sentinel-2 data caused trouble with newer versions of pystac. The following code blocks resolve these issues. In brief, the standards for storing projection data seem to have changed.

In [61]:
def print_item_properties(item, string:str="proj"):
    for key, value in item.properties.items():
        if string in key:
            print(f"{key}:{value}")
            
def fix_item_proj_properties(source, target, string:str="proj"):
    for key, value in source.properties.items():
        if string in key:
            target.properties[key] = value
    return target

Old way.

In [62]:
print_item_properties(items_t0[0])
proj:epsg:32611

New way.

In [63]:
print_item_properties(min_cloud_t1)
proj:code:EPSG:32611
proj:centroid:{'lat': 33.83606, 'lon': -118.56814}

Loop over old items and add projection metadata from newer item.

In [64]:
items_t0 = [fix_item_proj_properties(min_cloud_t1, item, "proj") for item in list(items_t0)]
items_t0
Out[64]:
[<Item id=S2A_11SLT_20250102_0_L2A>, <Item id=S2B_11SLT_20241218_0_L2A>]

Load Item ($t_0$)¶

Okay, back to business.

Prompt: Filter your $t_0$ items for the one with minimum cloud cover. Then, load your data using stac_load.

In [65]:
min_cloud_t0 = get_item_with_min_attribute(items_t0, attr='eo:cloud_cover')
In [501]:
data_t0 = stac_load([min_cloud_t0], 
                    bands = selected_bands,
                    bbox=intersection_poly.bounds,
                    chunks={},
                    resolution=10,
                    # Could be as low as 0.00009009, but we would run into memory errors
                    progress=tqdm).isel(time=0)

data_t0
Out[501]:
<xarray.Dataset> Size: 6MB
Dimensions:      (y: 489, x: 959)
Coordinates:
  * y            (y) float64 4kB 3.771e+06 3.771e+06 ... 3.766e+06 3.766e+06
  * x            (x) float64 8kB 3.521e+05 3.522e+05 ... 3.617e+05 3.617e+05
    spatial_ref  int32 4B 32611
    time         datetime64[ns] 8B 2024-12-18T18:45:03.766000
Data variables:
    swir16       (y, x) uint16 938kB dask.array<chunksize=(489, 959), meta=np.ndarray>
    swir22       (y, x) uint16 938kB dask.array<chunksize=(489, 959), meta=np.ndarray>
    nir          (y, x) uint16 938kB dask.array<chunksize=(489, 959), meta=np.ndarray>
    red          (y, x) uint16 938kB dask.array<chunksize=(489, 959), meta=np.ndarray>
    green        (y, x) uint16 938kB dask.array<chunksize=(489, 959), meta=np.ndarray>
    blue         (y, x) uint16 938kB dask.array<chunksize=(489, 959), meta=np.ndarray>
xarray.Dataset
    • y: 489
    • x: 959
    • y
      (y)
      float64
      3.771e+06 3.771e+06 ... 3.766e+06
      units :
      metre
      resolution :
      -10.0
      crs :
      EPSG:32611
      array([3771225., 3771215., 3771205., ..., 3766365., 3766355., 3766345.])
    • x
      (x)
      float64
      3.521e+05 3.522e+05 ... 3.617e+05
      units :
      metre
      resolution :
      10.0
      crs :
      EPSG:32611
      array([352145., 352155., 352165., ..., 361705., 361715., 361725.])
    • spatial_ref
      ()
      int32
      32611
      spatial_ref :
      PROJCRS["WGS 84 / UTM zone 11N",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 11N",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-117,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 120°W and 114°W, northern hemisphere between equator and 84°N, onshore and offshore. Canada - Alberta; British Columbia (BC); Northwest Territories (NWT); Nunavut. Mexico. United States (USA)."],BBOX[0,-120,84,-114]],ID["EPSG",32611]]
      crs_wkt :
      PROJCRS["WGS 84 / UTM zone 11N",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 11N",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-117,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 120°W and 114°W, northern hemisphere between equator and 84°N, onshore and offshore. Canada - Alberta; British Columbia (BC); Northwest Territories (NWT); Nunavut. Mexico. United States (USA)."],BBOX[0,-120,84,-114]],ID["EPSG",32611]]
      semi_major_axis :
      6378137.0
      semi_minor_axis :
      6356752.314245179
      inverse_flattening :
      298.257223563
      reference_ellipsoid_name :
      WGS 84
      longitude_of_prime_meridian :
      0.0
      prime_meridian_name :
      Greenwich
      geographic_crs_name :
      WGS 84
      horizontal_datum_name :
      World Geodetic System 1984 ensemble
      projected_crs_name :
      WGS 84 / UTM zone 11N
      grid_mapping_name :
      transverse_mercator
      latitude_of_projection_origin :
      0.0
      longitude_of_central_meridian :
      -117.0
      false_easting :
      500000.0
      false_northing :
      0.0
      scale_factor_at_central_meridian :
      0.9996
      GeoTransform :
      352140 10 0 3771230 0 -10
      array(32611, dtype=int32)
    • time
      ()
      datetime64[ns]
      2024-12-18T18:45:03.766000
      array('2024-12-18T18:45:03.766000000', dtype='datetime64[ns]')
    • swir16
      (y, x)
      uint16
      dask.array<chunksize=(489, 959), meta=np.ndarray>
      nodata :
      0
      Array Chunk
      Bytes 915.92 kiB 915.92 kiB
      Shape (489, 959) (489, 959)
      Dask graph 1 chunks in 4 graph layers
      Data type uint16 numpy.ndarray
      959 489
    • swir22
      (y, x)
      uint16
      dask.array<chunksize=(489, 959), meta=np.ndarray>
      nodata :
      0
      Array Chunk
      Bytes 915.92 kiB 915.92 kiB
      Shape (489, 959) (489, 959)
      Dask graph 1 chunks in 4 graph layers
      Data type uint16 numpy.ndarray
      959 489
    • nir
      (y, x)
      uint16
      dask.array<chunksize=(489, 959), meta=np.ndarray>
      nodata :
      0
      Array Chunk
      Bytes 915.92 kiB 915.92 kiB
      Shape (489, 959) (489, 959)
      Dask graph 1 chunks in 4 graph layers
      Data type uint16 numpy.ndarray
      959 489
    • red
      (y, x)
      uint16
      dask.array<chunksize=(489, 959), meta=np.ndarray>
      nodata :
      0
      Array Chunk
      Bytes 915.92 kiB 915.92 kiB
      Shape (489, 959) (489, 959)
      Dask graph 1 chunks in 4 graph layers
      Data type uint16 numpy.ndarray
      959 489
    • green
      (y, x)
      uint16
      dask.array<chunksize=(489, 959), meta=np.ndarray>
      nodata :
      0
      Array Chunk
      Bytes 915.92 kiB 915.92 kiB
      Shape (489, 959) (489, 959)
      Dask graph 1 chunks in 4 graph layers
      Data type uint16 numpy.ndarray
      959 489
    • blue
      (y, x)
      uint16
      dask.array<chunksize=(489, 959), meta=np.ndarray>
      nodata :
      0
      Array Chunk
      Bytes 915.92 kiB 915.92 kiB
      Shape (489, 959) (489, 959)
      Dask graph 1 chunks in 4 graph layers
      Data type uint16 numpy.ndarray
      959 489
    • y
      PandasIndex
      PandasIndex(Index([3771225.0, 3771215.0, 3771205.0, 3771195.0, 3771185.0, 3771175.0,
             3771165.0, 3771155.0, 3771145.0, 3771135.0,
             ...
             3766435.0, 3766425.0, 3766415.0, 3766405.0, 3766395.0, 3766385.0,
             3766375.0, 3766365.0, 3766355.0, 3766345.0],
            dtype='float64', name='y', length=489))
    • x
      PandasIndex
      PandasIndex(Index([352145.0, 352155.0, 352165.0, 352175.0, 352185.0, 352195.0, 352205.0,
             352215.0, 352225.0, 352235.0,
             ...
             361635.0, 361645.0, 361655.0, 361665.0, 361675.0, 361685.0, 361695.0,
             361705.0, 361715.0, 361725.0],
            dtype='float64', name='x', length=959))

Prompt: Plot an RGB version of the image.

In [502]:
normalized_rgb_t0 = normalize_to_rgb(data_t0)
normalized_rgb_t0.shape
Out[502]:
(489, 959, 3)
In [503]:
fig, ax = plt.subplots(figsize=(15, 15))

cax = ax.imshow(normalized_rgb_t0)
ax.set_title("The Pacific Palisades in LA before the January 2025 Fires", size=18)
Out[503]:
Text(0.5, 1.0, 'The Pacific Palisades in LA before the January 2025 Fires')
No description has been provided for this image
In [504]:
fig, ax = plt.subplots(figsize=(15, 15))

cax = ax.imshow(normalized_rgb_t1)
ax.set_title("The Pacific Palisades in LA After the January 2025 Fires", size=18)
Out[504]:
Text(0.5, 1.0, 'The Pacific Palisades in LA After the January 2025 Fires')
No description has been provided for this image

Spectral indexes for $t_0$¶

Prompt: Now, calculate the NDVI, NDWI, IBI, and NBR for all items at $t_0$.

In [505]:
ndvis_t0 = calculate_spectral_index_over_items(items_t0, selected_bands, bbox, return_ndvi)
ibis_t0 = calculate_spectral_index_over_items(items_t0, selected_bands, bbox, return_ibi)
nbrs_t0 = calculate_spectral_index_over_items(items_t0, selected_bands, bbox, return_nbr)
ndwis_t0 = calculate_spectral_index_over_items(items_t0, selected_bands, bbox, return_ndwi)
Processing item 1 out of 2
100%|████████████████████████████████████████████████████████████████████████████| 6/6 [00:07<00:00,  1.28s/it]
Processing item 2 out of 2
100%|████████████████████████████████████████████████████████████████████████████| 6/6 [00:05<00:00,  1.13it/s]
Processing item 1 out of 2
100%|████████████████████████████████████████████████████████████████████████████| 6/6 [00:03<00:00,  1.85it/s]
Processing item 2 out of 2
100%|████████████████████████████████████████████████████████████████████████████| 6/6 [00:03<00:00,  1.77it/s]
Processing item 1 out of 2
100%|████████████████████████████████████████████████████████████████████████████| 6/6 [00:03<00:00,  1.55it/s]
Processing item 2 out of 2
100%|████████████████████████████████████████████████████████████████████████████| 6/6 [00:03<00:00,  1.71it/s]
Processing item 1 out of 2
100%|████████████████████████████████████████████████████████████████████████████| 6/6 [00:03<00:00,  1.73it/s]
Processing item 2 out of 2
100%|████████████████████████████████████████████████████████████████████████████| 6/6 [00:03<00:00,  1.62it/s]

Prompt: Calculate the median for each index.

In [506]:
%time median_ndvi_t0 = calculate_median_index(ndvis_t0)
%time median_ibi_t0 = calculate_median_index(ibis_t0)
%time median_nbr_t0 = calculate_median_index(nbrs_t0)
%time median_ndwi_t0 = calculate_median_index(ndwis_t0)
Concatenating Spectral Index images.
Calculating the means, this will take a while.
CPU times: user 32 ms, sys: 7.81 ms, total: 39.8 ms
Wall time: 39.3 ms
Concatenating Spectral Index images.
Calculating the means, this will take a while.
CPU times: user 29.6 ms, sys: 961 µs, total: 30.6 ms
Wall time: 30.6 ms
Concatenating Spectral Index images.
Calculating the means, this will take a while.
CPU times: user 29.7 ms, sys: 3.8 ms, total: 33.5 ms
Wall time: 33.5 ms
Concatenating Spectral Index images.
Calculating the means, this will take a while.
CPU times: user 30.2 ms, sys: 3.03 ms, total: 33.2 ms
Wall time: 33.2 ms

Prompt: Convert these medians from xarray to numpy.

In [507]:
median_ndvi_t0_np = xr_spectral_index_data_to_np(median_ndvi_t0)
median_nbr_t0_np = xr_spectral_index_data_to_np(median_nbr_t0)
median_ibi_t0_np = xr_spectral_index_data_to_np(median_ibi_t0)
median_ndwi_t0_np = xr_spectral_index_data_to_np(median_ndwi_t0)

Prompt: Plot each of these medians. Remember to filter for water!

In [508]:
water_mask_t0 = median_ndwi_t0_np > 0.1
In [509]:
median_ndvi_t0_np_water_masked = np.where(water_mask_t0, np.nan, median_ndvi_t0_np)

plot_territory(median_ndvi_t0_np_water_masked, 30, 10, 'Greens', 'Median NDVI T0')
No description has been provided for this image
In [510]:
median_ibi_t0_np_water_masked = np.where(water_mask_t0, np.nan, median_ibi_t0_np)

plot_territory(median_ibi_t0_np_water_masked, 30, 10, 'Purples', 'Median IBI T0')
No description has been provided for this image
In [511]:
median_nbr_t0_np_water_masked = np.where(water_mask_t0, np.nan, median_nbr_t0_np)

plot_territory(median_nbr_t0_np_water_masked, 30, 10, 'Reds_r', 'NBR T0')
No description has been provided for this image

Building Filter¶

Prompt: We are mainly interested in damage for buildings. For that purpose:

  1. Setup a building filter similar to water.
  2. Mask that filter for water.
  3. Then plot this "buildings but no water".
In [512]:
building_filter = median_ibi_t0_np > -.25
buildings = np.where(building_filter, median_ibi_t0_np, np.nan)
buildings_water_masked = np.where(np.flipud(water_mask_t1), np.nan, buildings)
In [513]:
plot_territory(buildings_water_masked, 30, 10, 'Purples', 'Buildings T0')
No description has been provided for this image

Calculating the Spectral differences¶

Now we are approaching the grand finale! We want to calculate the differences between $t_1$ and $t_0$ values. I'll show how with NDVI.

In [514]:
ndvi_difference = median_ndvi_t1 - median_ndvi_t0
ndvi_difference_np = xr_spectral_index_data_to_np(ndvi_difference)
ndvi_difference_np[ndvi_difference_np>0] = 0
In [515]:
plot_territory(ndvi_difference_np, 40, 10, 'YlGn', 'Negative NDVI Difference')
No description has been provided for this image

Prompt: Now do the same with the NBR.

In [516]:
nbrs_difference = median_nbr_t1 - median_nbr_t0
nbrs_difference_np = xr_spectral_index_data_to_np(nbrs_difference)
nbrs_difference_np[nbrs_difference_np>0] = 0
nbrs_difference_np_water_masked = np.where(np.flipud(water_mask_t1), np.nan, nbrs_difference_np)
In [517]:
plot_territory(nbrs_difference_np_water_masked, 40, 10, 'Reds_r', 'Negative NBR Difference')
No description has been provided for this image

Okay, the final "mask".

Prompt: Use both the NBR filter and our $t_0$ buildings to map buildings that sustained fire damage.

In [518]:
building_mask = np.isnan(buildings)
burned_buildings = np.where(building_mask, np.nan, nbrs_difference_np)
burned_buildings = np.where(nbrs_difference_np < -.25, burned_buildings, np.nan)
burned_buildings = np.where(water_mask_t0, np.nan, burned_buildings)
In [519]:
plot_territory(burned_buildings, 40, 10, 'Reds_r', 'Negative NBR Difference')
No description has been provided for this image

Plotting it all¶

Now we can return to the image at the start.

Prompt: Use the code below to plot the outputs from your experiments above. burned_buildings should be an array with NBR values for building pixels and nan elsewhere. normalized_rgb_t1 should be an array with RGB-values normalized to the 0, 1 range.

In [520]:
# Create the figure and plot the base image
fig, ax = plt.subplots(figsize=(15, 15))
base = ax.imshow(normalized_rgb_t1, alpha=0.35)  # The background image
ax.set_title("Burned Structures During the 2025 LA Palisades Fires", size=18)

# Overlay the second dataset on top
overlay = plot_overlay(ax, burned_buildings, cmap="YlOrRd", alpha=1)

# Add a colorbar for the overlay
cbar = plt.colorbar(overlay, ax=ax, fraction=0.02, pad=0.02)
cbar.ax.tick_params(labelsize=12)
cbar.set_label("Differenced NBR for buildings", size=14)
fig.savefig("img/burned_structures_highres.png", dpi=300, bbox_inches="tight")
No description has been provided for this image

Comparing with building footprints¶

How well did we do? We can compare with footprints of buildings provided by the LA county in order to evaluate.

Drawing

Source: https://data.lacounty.gov/datasets/lacounty::2023-buildings-with-dins-data/explore

In [521]:
la_buildings = gpd.read_file("data/2023_Buildings_with_DINS_data.geojson")
la_buildings.head(3)
Out[521]:
OBJECTID CODE BLD_ID HEIGHT ELEV SOURCE DATE_ STATUS OLD_BLD_ID AREA DAMAGE STRUCTURET Shape__Area Shape__Length geometry
0 1 Building 405063833902 29.21 95.95 LARIAC2 2008 Unchanged None 1062.196900 None None 144.039062 57.653066 POLYGON Z ((-118.51685 34.03063 0, -118.5168 3...
1 2 Building 405077833794 16.68 54.91 LARIAC2 2008 Unchanged None 1339.697198 None None 181.675781 59.368595 POLYGON Z ((-118.51679 34.03032 0, -118.51674 ...
2 3 Building 404932833728 2.12 51.39 LARIAC2 2008 Unchanged None 357.872695 None None 48.527344 28.082028 POLYGON Z ((-118.51735 34.03008 0, -118.5173 3...
In [523]:
# Classify damage into three categories.
def classify_damage(damage):
    if damage == 'No Damage' or damage is None:
        return 'Undamaged'
    elif damage == 'Inaccessible':
        return 'Inaccessible'
    else:
        return 'Damaged'
In [524]:
# Add a new column for the classified damage category.
la_buildings["damage_category"] = la_buildings["DAMAGE"].apply(classify_damage)

Prompt: Replace burned_buildings in the code below with your array with damage to buildings. How did you do?

In [528]:
plot_buildings_and_raster(la_buildings, burned_buildings)
No description has been provided for this image